newbie01 Temat założony przez niniejszego użytkownika |
[C] Porównywanie łańcuchów znaków » 2016-10-21 15:23:45 Siema, dostałem takie zadanie: Napisz program, który pyta o imię użytkownika. Następnie zlicza ile liter ’a’ (nie rozróżniamy dużych i małych liter) występuje w tym imieniu. jak narazie doszedłem do czegoś takiego, i nie mam pojęcia co mam z tym dalej zrobić :/ #include <stdio.h> #include <stdlib.h> #include <string.h>
main() { int i = 0, x = 0; char imie[ 1024 ]; char a[ 3 ] = { 'A', 'a' }; printf( "Podaj imie: " ); fgets( imie, 1024, stdin ); x = strcmp( imie, a, 1024 ); for( i = 0; i < 1024; i++ ) { if( strcmp( imie, a ) == 0 ) } return( 0 ); }
|
|
carlosmay |
» 2016-10-21 15:46:09 Przepuść imię literkę po literce w pętli, i szukaj wystąpienia literki 'a'. Gdy znajdziesz powiększ licznik. np. coś takiego: for( int i = 0; imie[ i ] != '\0'; ++i ) { if( tolower( imie[ i ] ) == a ) { licznik += 1; } }
printf( "literka %c pojawia sie %d razy w imieniu %s", a, licznik, imie ); |
|
newbie01 Temat założony przez niniejszego użytkownika |
» 2016-10-21 16:31:39 Dzięki za tak szybką odpowiedź. Niestety program sie crashuje po zastosowaniu instrukcji na wzór jaki podałeś. Z tego co wiem nie można porównywać łańcuchów znaków poprzez operator == tylko poprzez funkcję strcmp, jednak nie mam pojęcia jaki warunek napisać do if'a to co mam aktualnie: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> main() { int i = 0, licznik = 0; char imie[ 1024 ]; char a[] = { 'a', 'A' }; printf( "Podaj imie: " ); fgets( imie, 1024, stdin ); for( i = 0; i < 1024; ++i ) { if( strcmp( imie, a ) == 0 ) { licznik += 1; } } printf( "liczba a to %d\n", & licznik ); return( 0 ); }
z góry dzięki za wszelką dalszą pomoc |
|
michal11 |
» 2016-10-21 17:04:20 imie[ i ] to nie jest łańcuch znakowy tylko zwykły char które można porównywać operatorem ==. carlosmay podał ci praktycznie gotowy kod, jeżeli masz jakieś błędy to je tu wklej. W tym zadaniu nie musisz używać strcmp. licznik += 1; ciekawe rozwiązanie. |
|
carlosmay |
» 2016-10-21 18:06:11 Nie mogę zapamiętać, czy czyste C ma inkrementację, a w kroku nagłówku ++i poszedł nawykiem. for( i = 0; i < 1024; ++i ) { if( strcmp( imie, a ) == 0 ) { licznik += 1; } } |
Funkcja strcmp porównuje łańcuchy, a nie sprawdza wystąpienie znaku w łańcuchu. printf( "liczba a to %d\n", & licznik ); |
Tutaj wypisujesz adres zmiennej 'licznik' zamiast jej wartości. & jest niepotrzebne. |
|
newbie01 Temat założony przez niniejszego użytkownika |
» 2016-10-21 18:43:39 przy kodzie: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> main() { int i = 0; int licznik = 0; char imie[ 1024 ]; printf( "Podaj imie: " ); fgets( imie, 1024, stdin ); for( int i = 0; imie[ 1024 ] != '\0'; i++ ) { if( tolower( imie[ 1024 ] ) == a ) { licznik += 1; } } printf( "liczba a to %d\n", & licznik ); return( 0 ); }
wyskakuje błąd że w linii 14 "identifier "a" is undefined" |
|
carlosmay |
» 2016-10-21 18:47:15 wyskakuje błąd że w linii 14 "identifier "a" is undefined" |
Ponieważ nie masz zadeklarowanej zmiennej a . Wstaw gdzieś wcześniej char a = 'a'; lub porównaj do znaku na sztywno, czyli if( tolower( imie[ 1024 ] ) == 'a' )
W twoim pierwszym kodzie była tablica o nazwie a . Zamieniłem ją na pojedynczy znak o tej samej nazwie (nie wspomniałem o tym, przepraszam). edit: poprawna wersja to if( tolower( imie[ i ] ) == a )
|
|
newbie01 Temat założony przez niniejszego użytkownika |
» 2016-10-21 19:03:21 https://i.imgsafe.org/a49b94a34a.jpgzdjęcie pokazujące na jakim etapie program się "zacina" środowisko nie pokazuje już żadnych błędów aktualny kod: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> main() { int i = 0; int licznik = 0; char imie[ 1024 ]; char a = 'a'; printf( "Podaj imie: " ); fgets( imie, 1024, stdin ); for( int i = 0; imie[ 1024 ] != '\0'; i++ ) { if( tolower( imie[ 1024 ] ) == a ) { licznik += 1; printf( "liczba a to %d\n", & licznik ); } } return( 0 ); }
wiem że dla was to jest obvious, ale proszę zrozumcie że jestem po 2 zajęciach z programowania(nigdy wczesniej nie miałem z tym styczności) i jakoś do mnie to nie dociera. |
|
« 1 » 2 |