2015-09-10 11 views
6

Otrzymuję błąd, gdy przechodzę przez wskaźnik znaków i sprawdzam, kiedy wskaźnik osiągnie terminator o wartości zero.Porównanie ostrzeżenia między wskaźnikiem a liczbą całkowitą

const char* message = "hi"; 

//I then loop through the message and I get an error in the below if statement. 

if (*message == "\0") { 
    ...//do something 
} 

Błąd otrzymuję to:

warning: comparison between pointer and integer 
     ('int' and 'char *') 

Myślałem, że * przed message dereferences wiadomości, więc uzyskać wartość gdzie punkty wiadomość do? Nie chcę przy okazji korzystać z funkcji bibliotecznej strcmp.

+1

Zauważ, że '" \ 0 "' jest ciągiem z dwoma kolejnymi bajtami zerowymi (więc drugiego nie można znaleźć za pomocą ciągów manipulujących funkcjami takimi jak 'strlen()', ponieważ zatrzymują się przy pierwszym bajcie zerowym). Pusty ciąg '' "' składa się z pojedynczego bajtu null. –

Odpowiedz

22

Powinno być

if (*message == '\0') 

W C, proste cytaty wyznaczają pojedynczy znak natomiast cudzysłowy są na łańcuchach.

+0

Och, więc podwójne cudzysłowy robią różnicę? Dzięki, mogę teraz skompilować z powodzeniem. – catee

+1

Chętnie pomogę. Ostrzeżenie oznacza, że ​​próbujesz porównać znak z łańcuchem, stąd "porównanie między wskaźnikiem (ciąg) a liczbą całkowitą (znak)". –

7

To: "\0" to ciąg znaków, a nie znak. Znak używa pojedynczych cudzysłowów, takich jak '\0'.

5

W tej linii ...

if (*message == "\0") { 

... jak widać w ostrzeżeniu ...

 
warning: comparison between pointer and integer 
     ('int' and 'char *') 

... jesteś rzeczywiście porównywania int z char *, lub bardziej szczegółowo, int z adresem do char.

Aby rozwiązać ten problem, należy zastosować jedną z następujących czynności:

if(*message == '\0') ... 
if(message[0] == '\0') ... 
if(!*message) ... 

Na marginesie, jeśli chcesz porównać ciągi należy użyć strcmp lub strncmp, znaleziono w string.h.