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

Usuwanie bialych znakow

Object Storage Arubacloud
0 głosów
2,047 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,190 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,190 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,590 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,000 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,190 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ź 428 wizyt
pytanie zadane 8 czerwca 2020 w C i C++ przez fortuna Początkujący (310 p.)
0 głosów
2 odpowiedzi 555 wizyt
pytanie zadane 18 grudnia 2019 w C i C++ przez Lok Nowicjusz (220 p.)
0 głosów
1 odpowiedź 286 wizyt
pytanie zadane 17 grudnia 2022 w C i C++ przez Stahious Nowicjusz (150 p.)

92,565 zapytań

141,416 odpowiedzi

319,596 komentarzy

61,948 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...