2016-09-20 6 views
0

Ich habe versucht, ein einfaches Programm zu erstellen, das die Mitglieder eines Arrays durchläuft und die Zeichen nach einem bestimmten Zeichen scannt. Ich bin auf ein Problem gestoßen, wo strcmp() nur am Anfang der Schleife funktioniert. Ich habe Mühe zu verstehen, warum das passiert und jede Hilfe wäre willkommen.strcmp funktioniert nur am Anfang einer Schleife

char *file[3] = {"!x", "!!x", "x!"}; 

for (int i = 0; i < sizeof(file)/sizeof(file[0]); i++) { 
    char *line = file[i]; 
    printf("\n"); 
    for (int i = 0; i < strlen(line); i = i + 1) { 
    char character = line[i]; 
    if (strcmp("!", &character) == 0) { 
     printf("[YES] %c\n", character); 
    } else { 
     printf("[NO] %c\n", character); 
    } 
    } 
} 

Output

[YES] ! 
[NO] x 

[YES] ! 
[NO] ! 
[NO] x 

[NO] x 
[NO] ! 
+0

Warum verwenden Sie eine ** string ** Vergleichsfunktion, um einzelne ** Zeichen ** zu vergleichen? – Olaf

+0

Sie haben möglicherweise undefiniertes Verhalten: nichts garantiert, dass der Zeiger auf ein Zeichen irgendwo in der Nähe eine Null hat, da es keine Zeichenfolge ist. –

+0

Die Kommentare hier über eine Null-terminate-Zeichenfolge, die erforderlich ist, sind natürlich korrekt. Das Verhalten erscheint immer noch merkwürdig, da wir in diesem Fall wissen, was nach & kommt, da wir den Rest der Zeichen in der Zeichenfolge kennen. Es ist mir nicht klar, warum es sich auf diese spezielle Art und Weise falsch verhält. – Brick

Antwort

2

Die strcmp Funktion erwartet die Adresse eines Null-Zeichenfolge beendet. Stattdessen geben Sie die Adresse eines char. strcmp versucht dann, Speicherorte nach character zu lesen, was zu undefined behavior führt.

Das eigentliche Problem ist jedoch, dass Sie Zeichenfolgen nicht vergleichen möchten. Sie möchten Zeichen vergleichen.

if (character == '!') { 
0

strcmp() vergleicht nullterminierte Strings. Im Code:

char character = line[i]; 
if (strcmp("!", &character) == 0) 

Die character ist keine nullterminierte Zeichenfolge. Es ist zufällig, dass es überhaupt funktioniert.

Sie brauchen etwas mehr wie diese Zeichenfolgen vergleichen:

char character[2] = { line[i], '\0' }; 
if (strcmp("!", character) == 0) 

Oder so Zeichen vergleichen:

char character = line[i]; 
if (character == '!') 
1

Das Problem hier ist, sind Sie falsch Argument strcmp() Versorgung, die &character ist kein Zeiger auf eine Zeichenfolge.

Zitat C11, Kapitel int strcmp (const char * s1, const char * s2);

int strcmp(const char *s1, const char *s2);

Die strcmp Funktion vergleicht der String ist, auf von s1 zum String ist, auf von s2.

So rechnet er sowohl die Argumente von String Typ sein, die in Ihrem Fall ist es nicht.

Sie können einfach verwenden Sie den Vergleichsoperator ==char s zu vergleichen, wie

if (line[i] == '!') //notice the '' s, they are not ""s 

und so weiter.

Verwandte Themen