• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Usuwanie bialych znakow

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
0 głosów
2,710 wizyt
pytanie zadane 3 czerwca 2019 w C i C++ przez DobryKurczak Bywalec (2,320 p.)

Dobry wieczór.

Mam do zrobienia funkcja która usunie wszystkie białe znaki, czyli spacje, tabulacje itp. Oto co zrobiłem:

void UsunBialeZnaki(char *s) {
	int i = 0, j = 0;
	while (s[i]) {
		if (s[i] == ' ' || s[i] == '\t' || s[i] == '\n')
			++i;
		s[j] = s[i];
		++j;
		++i;

	}
	printf("%s", s);
}

void main() {

	 char tablica[100];
	 printf("Podaj dowolny ciag znakow...");
	 scanf("%s", tablica);
	 UsunBialeZnaki(tablica);
}

Problem wygląda następująco: gdy uruchamiam program w konsoli i wpisuje jakiś ciąg znaków np. "Usun biale znaki   ." to wyświetla mi sie "Usun". Co tutaj należy poprawić, bo kod pod względem logiki wydaje się poprawny. Z góry dziękuję za pomoc.

komentarz 4 czerwca 2019 przez Piotr Batko Stary wyjadacz (13,210 p.)
Uwaga do algorytmu: jak już zastosujesz rady od Crissa, przetestuj sobie napis, w którym występują dwa białe znaki po sobie, np.: "a<spacja><spacja>b".
komentarz 5 czerwca 2019 przez DobryKurczak Bywalec (2,320 p.)
Sprawdzilem i zauważyłem, że:

-usuwa tylko jedna spację, gdy są obok siebie;

-na koncu zdania przypisuje ostatnią litere napisu.

np podaje na wejsciu napis: "Ala ma kota"

zwraca mi "Alamakotaa"

Trochę to dziwne.
komentarz 5 czerwca 2019 przez Piotr Batko Stary wyjadacz (13,210 p.)
To dlaczego usuwa tylko jedną spację, to już musisz wymyślić sam czytając swój algorytm. Ale dlaczego zostają literki na końcu postarałem się wytłumaczyć niżej, w komentarzu do odpowiedzi Crissa.
komentarz 5 czerwca 2019 przez DobryKurczak Bywalec (2,320 p.)
Dobra dzięki za pomoc! Już wiem, gdzie mniej więcej szukać problemu i jak go rozwiązać.

2 odpowiedzi

+2 głosów
odpowiedź 3 czerwca 2019 przez criss Mędrzec (172,570 p.)
Problem nie wynika z algorytmu tylko z obsługi inputu. Do `tablica` wczytujesz tylko pierwsze słowo. Poczytaj w internecie jak sobie z tym poradzić.

Jednak jedna rzecz o której zapomniałeś, to że powinieneś stawiać zero na koniec wynikowego ciągu.
komentarz 5 czerwca 2019 przez DobryKurczak Bywalec (2,320 p.)
Stawiać zero to znaczy co?
komentarz 5 czerwca 2019 przez tkz Nałogowiec (42,060 p.)
Nie wiem czy o to dokładnie chodziło Criss'owi, ale o bajt zerowy na końcu znaku, taki odnośnik, że to koniec słowa
komentarz 5 czerwca 2019 przez DobryKurczak Bywalec (2,320 p.)
Rozumiem, że zero to chodziło o bajt zerowy \0 (znaczy tak się domyślam). Natomiast bardziej chciałem się dowiedzieć w którym miejscu programu ma być to zero.
komentarz 5 czerwca 2019 przez Piotr Batko Stary wyjadacz (13,210 p.)

Jak tworzysz napis "abc" to w pamięci komputera on jest przechowywany jako 'a', 'b', 'c', '\0'. Ten znak na końcu służy do oznaczenia końca napisu. Kiedy wołasz do pracy funkcję printf("%s", str), to ona będzie wypisywać po kolei znaczki z str-a, do póki nie trafi na '\0'.

U Ciebie brak wstawienia tego znaku powoduje błędne działanie programu. Załóżmy, że masz napis 'a', '<spacja>', 'b', '\0'. Wrzucam go do Twojej funkcji usuń białe znaki. Ona działa tak, że zostawi napis w postaci 'a', 'b', 'b', '\0'. Powinieneś po zakończeniu kasowania białych znaków oznaczyć, gdzie teraz kończy się napis (wstawić w to miejsce '\0'). Czyli po pracy Twojej funkcji, napis powinien wyglądać tak: 'a', 'b', '\0'.

+1 głos
odpowiedź 4 czerwca 2019 przez mrspock1 Mądrala (6,420 p.)
Tak nie usuniesz wszystkiego porządnie. Są jeszcze znaki unicode zero-terminated
https://330k.github.io/misc_tools/unicode_steganography.html
oraz znaki unicode o wysokich adresach.
https://www.irongeek.com/i.php?page=security/unicode-steganography-homoglyph-encoder
W obu wypadkach są one obecne w tekście ale nie są widoczne przy wyświetlaniu. Co prawda nie jest to szkodliwe, ale użytkownik może na nich zapisać zakodowaną wiadomość. Jeżeli chcesz utrudnić użytkownikom tajne porozumiewanie się, podawanie linków do stron, to kasuj te znaki, blokuj załączniki.

Podobne pytania

0 głosów
1 odpowiedź 614 wizyt
pytanie zadane 8 czerwca 2020 w C i C++ przez fortuna Początkujący (310 p.)
0 głosów
2 odpowiedzi 694 wizyt
pytanie zadane 18 grudnia 2019 w C i C++ przez Lok Nowicjusz (220 p.)
0 głosów
1 odpowiedź 497 wizyt
pytanie zadane 17 grudnia 2022 w C i C++ przez Stahious Nowicjusz (150 p.)

93,440 zapytań

142,431 odpowiedzi

322,679 komentarzy

62,802 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

...