2012-04-13 18 views
2

So lese ich in Zeichen eine nach der anderen aus einer Datei:Warum gibt strcmp in diesem Kontext keine 0 zurück?

char temp[3]; 

temp[0] = nextchar; 
printf("%c",temp[0]); //prints % 

temp[1] = nextchar = fgetc(srcptr); 
printf("%c",temp[1]); //prints 2 

temp[2] = nextchar = fgetc(srcptr); 
printf("%c",temp[2]); //prints 0 

if(strcmp(temp, "%20") == 0) { printf("%s","blahblah"); } 

Im Idealfall sollte diese „blahblah“ am Ende drucken. Allerdings nicht. Warum gibt also strcmp 0 zurück, und noch wichtiger: Wie kann ich das beheben?

Antwort

9

Sie müssen null beenden temp.

EDIT

ändern char temp[3];-char temp[4]; temp[3] = 0;

6

Verwenden memcmp statt, weil strcmp beide Strings erwartet '\0' terminierte zu sein (und temp nicht):

if(memcmp(temp, "%20", sizeof(temp)) == 0) { printf("%s","blahblah"); } 
3

Ein String ist ein Array von Zeichen, das mit dem Zeichen '\ 0' endet. Da Ihr tmp Array drei Zeichen enthalten kann und keines davon das abschließende Nullzeichen ist, wird strcmp (und jede andere Zeichenfolgenfunktion) davon ausgehen, dass es weitergeht und Speicher über den zugewiesenen Speicherplatz hinausliest, bis er auf ein Nullzeichen stößt (oder abstürzt, wenn er ermüdet) einen eingeschränkten Speicherplatz zu lesen).

Die Zeichenfolge "% 20" ist wirklich die Zeichen: '%', '2', '0', '\ 0'

So ist der einfachste Weg, es zu beheben ist tmp ein größerer zu deklarieren und zuweisen '\ 0' bis zum letzten Element:

char tmp[4]; 
... 
tmp[3] = '\0'; 
Verwandte Themen