2017-03-27 85 views
5

W poniższym kodzie używam strcmp do porównywania dwóch łańcuchów i sprawiam, że porównywanie stanie się warunkiem instrukcji if. Za pomocą poniższego kodu wynik będzie wynosił hello world, ponieważ ciąg "jeden" jest równy łańcuchowi "dwa".C - strcmp powiązane z instrukcją if

#include <stdio.h> 
#include <string.h> 

char one[4] = "abc"; 
char two[4] = "abc"; 

int main() { 

    if (strcmp(one, two) == 0) { 
     printf("hello world\n"); 
    } 
} 

Teraz chcę zmienić program i uczynić go wydrukować hello world jeśli dwa ciąg są różne, tak zmienić program w ten sposób:

#include <stdio.h> 
#include <string.h> 

char one[4] = "abc"; 
char two[4] = "xyz"; 

int main() { 

    if (strcmp(one, two) == 1) { 
     printf("hello world\n"); 
    } 
} 

ja nie rozumiem, dlaczego nie robi wydrukuj wszystko.

+2

Zmień 'if (strcmp (jeden, dwa) == 1)' na 'if (strcmp (jeden, dwa)! = 0)'. – AntonH

+0

@EdHeal masz całkowitą rację, byłem tak pewien, że zwraca 1 jeśli łańcuchy nie są równe, przepraszam, następnym razem będzie to pierwsza rzecz, którą zrobię – scugn1zz0

Odpowiedz

6

Ponieważ strcmp() powróci negatywny całkowitą w tym przypadku.

Więc to zmienić:

if (strcmp(one, two) == 1) { 

do tego:

if (strcmp(one, two) != 0) { 

wziąć pod uwagę wszystkie przypadki, które różnią się struny.

Zauważ, że mogłeś zauważony że sam albo przez czytanie ref lub drukując co powraca funkcje, takie jak ten:

printf("%d\n", strcmp(one, two)); 
// prints -23 
+0

Sure @FREE_AND_OPEN_SOURCE, która też by działała! – gsamaras

1

Źle zrozumiałeś, jak działa strcmp. Aby sprawdzić, czy łańcuchy są innego zastosowania

if(strcmp(one, two)) 
2

strcmp zwraca zero, gdy oba ciągi są równe, zwraca coś innego od zera, gdy różni, więc trzeba zmienić, jeśli w kodzie, aby coś takiego

if (strcmp(one, two) != 0) { 
    printf("hello world\n"); 
} 
2

według standardu C (7.23.4.2 funkcją strcmp)

3 Funkcja strcmp powraca liczbą całkowitą większą niż, równa lub mniej niż zero, odpowiednio jako łańcuch wskazała na S1 jest większa , równa lub mniejsza niż łańcuch wskazywany przez s2.

Więc co musisz zrobić, to napisać if jak

if (strcmp(one, two) != 0) { 

lub

if (!(strcmp(one, two) == 0)) { 
1

Prawidłowe zachowanie jest:

if (strcmp(one, two) != 0) { 
    printf("hello world\n"); 
} 

Właściwie, to funkcja zwraca różnica między dwa ciągi:

  • < 0: pierwszy znak, który nie pasuje ma niższą wartość niż w PTR2 PTR1.
  • 0: zawartość obu łańcuchów jest równa
  • > 0: pierwszy znak, który nie pasuje, ma większą wartość w ptr1 niż w ptr2.

This is an example of how strcmp could be implemented