[C/C++] Co jest z if!?

0

Mam maly problemik z funkcja if.
po napisaniu przykladowego programu:

#include
void main(void)
{
char imie;
printf("Podaj swoje imie: ");
scanf("%s",imie);
if (imie == 'Piotr')
{
printf("Witaj szefie");
}
else
{
printf("Witaj kmiotku");
}
}

cd. Po wpisaniu "Piotr" pojawia sie napis 'Witaj kmiotku'. Pomimo wielu prob nie udalo mi sie dojsc do tego...
Kto mi moze pomoc?

0

do porownywania ciagow znakow uzywaj funkcji [b]strcmp[/b]
a nie [b]zmienna == 'ciag_znakow'[/b]

pozdrawiam wojta$

0

w jezyku c lancuch znakow(string) nie jest wbudowanym typem danych wiec operator == nie bedzie "dzialal" poprawnie(chyba ze go przeladujesz albo uzyjesz klasy string, ale to juz inna historia),lancuch to nic innego niz tablica , i jesli uzyjesz operatora == miedzy nimi to da on wartosc true tylko wtdedy jesli 1szy element tablicy bedzie sie znajdowal w tym samym miejscu pamieci co 1szy elemnt z drugiej tablicy(czyli to ta sama tablica hehe),patrz wskazniki,w takim wypadku najlepiej jest napisac funkcje ktora bedzie porownywac lancuchy lub skorzystac z fun. strcmp() ,jest ona w string.h (ASCI C), zwraca ona wartos zero jesli lancuchy sa rowne czyli if (! strcmp(str1,str2) ) to bleble...

0

nic nie zrozumialem ale dzieki :)

0

w jezyku c lancuch znakow(string) nie jest wbudowanym typem danych wiec operator == nie bedzie "dzialal" poprawnie(chyba ze go przeladujesz albo uzyjesz klasy string, ale to juz inna historia),lancuch to nic innego niz tablica , i jesli uzyjesz operatora == miedzy nimi to da on wartosc true tylko wtdedy jesli 1szy element tablicy bedzie sie znajdowal w tym samym miejscu pamieci co 1szy elemnt z drugiej tablicy(czyli to ta sama tablica hehe),patrz wskazniki,w takim wypadku najlepiej jest napisac funkcje ktora bedzie porownywac lancuchy lub skorzystac z fun. strcmp() ,jest ona w string.h (ASCI C), zwraca ona wartos zero jesli lancuchy sa rowne czyli if (! strcmp(str1,str2) ) to bleble...

Ach. To jeszcze jedna rzecz, która w C nie podoba mi się. W Delphi nawet tablice można porównać w ten sposób...
Niereb: co tu nie rozumieć. Zamiast:
if (imie == 'Piotr')
dajesz:
if (! strcmp(imie, 'Piotr'))

0

To nie wada ale zaleta C :-P . Własnie dlatego c rózni sie od pascala bo ma wskazniki a string to wskaznik.

0

po pierwsze to masz złą deklarację danych - zadeklarowałeś pojedynczy znak (char imie) a trzeba zadeklarować tablicę znaków(char imie[20]) lub wskaźnik na znak (char * imie) Poza tym pamiętaj że takie nawiasy ' ' (pojedyncze) używaj tylko do pojedynczych liter, do ciągów znaków (stringów) muszą być " " potem przy sprawdzeniu wystarczy porównac funkcją int strcmp(char*,char*)

A tak w ogóle to dziwię się że prog się nie wykrzaczył, skoro podałeś w formacie argumentu string (wskaźnik na znak) a jako zmienną podałeś znak
Kod powinien wyglądać mniej więcej tak:

#include <string.h> //poczytaj o tej bibliotece
#include <stdlib.h> //dokładnie nie pamiętam , bo dawno nie pisałem w
//DOS ale jeżeli używasz funkcji scanf(), printf() to
//potrzeba 'zainkludować' :)
void main() //nie musisz pisać (void) w argumentach
{
char imie[20]; //ile znaków zadeklarujesz zależy od ciebie
printf("Podaj swoje imie: ");
scanf("%s",imie);
if (!strcmp(imie,"Piotr")) /funkcja strcmp (STRing CoMPare) zwraca 0 jeżeli oba łańcuchy są takie same ten zapis oznacza(jeżeli to co zwróciło jest równe zero) a poza tym w bibliotece string.h jest podobna funkcja w której jest jeszcze podział na małe lub wielkie litery może się przydać/
{
printf("Witaj szefie");
}
else
{
printf("Witaj kmiotku");
}
}

Pozdrawiam

0

Inną metodą może być załadowanie napisu do tablicy
a potem przy użyciu pętli for możesz sprwadzić czy w danej komórce znajduje się odpowiednia litera...chociaŻ jest to droga na około bo istnieje przecieŻ do tego odpowiednia funkcja :d którą wymienili juz inni przedemna wiec nie bede się powtarzał [hurra]

0

Znakow nie mozna porownywac w nastepujacy sposob:
zmienna == "string"
Trzeba to porownac za pomoca instrukcji strcmp.
Aby uzyc tej instrukcji musisz dolaczyc plik naglowkowy string.h.
Pozdrawiam!!!!

:-) :-) :-)

0

michal1224: kilka spraw do Ciebie

  1. nie odgrzewaj starych postów (tego to się akurat nie tyczy :))
  2. czytaj odpowiedzi na posty, zanim napiszesz swoją, w większości przypadków napisałeś to, co już zostało napisane.
0

To nie wada ale zaleta C :-P . Własnie dlatego c rózni sie od pascala bo ma wskazniki a string to wskaznik.

W Pascalu string to nie wskaźnik, tylko tablica (i to specyficzna).
W Delphi jest natomiast już typ PChar, który jest stringiem w rozumieniu C (czyli wskaźnik do pierwszego znaku łańcucha zakończonego symbolem 0).
I mimo, że to jest wskaźnik to jest już wbudowany operator porównania takich zmiennych na takich samych zasadach jak dla stringów pascalowych.
Ale nie będę się z tobą sprzeczał na temat czy jest to wada i zaleta, bo twoje zdanie jest wszystkim znane i nie zamierzam nakłaniać cię do zmiany poglądów. (Konstytucja Art. 54. ust. 1 :) )

0

W Pascalu string to nie wskaźnik, tylko tablica (i to specyficzna).
W Delphi jest natomiast już typ PChar

W TP też był.

0

Zawsze można użyć klasy AnsiString. Ona ma wbudowany operator porównania "==" i wiele innych użytecznych rzeczy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1