2016-10-20 2 views
0

vergleicht Ich habe folgende Code in C:C strcmp() gibt positive, wenn String mit char pointer

#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char *argv[]) 
{ 

    char *buf; 

    buf = malloc(sizeof(char) * 512); 


    while(strcmp(buf, "Exit!") != 0) 
    { 
     printf("Enter something:"); 
     fgets(buf, sizeof(char) * 512, stdin); 
     printf("You entered %s\n", buf); 

     printf("%d\n", strcmp(buf, "Exit!")); 

    } 

} 

Das Verhalten ich will, ist für die while Schleife zu beenden, wenn der Benutzer den spezifizierten string eintritt. Von dem, was ich verstehe, kann ich einen char Zeiger verwenden, um einen string in C darzustellen. Ich speichere die Benutzereingabe unter Verwendung fgets() und Vergleiche unter Verwendung der strcmp() Funktion. Ich habe eine Debug-Anweisung hinzugefügt, die das Ergebnis dieses Vergleichs ausgibt und eine positive Ganzzahl zurückgibt, wenn ich "Exit!" was sollte die while-Schleife beenden.

Könnte jemand erklären, was ich vermisse? Ich glaube, es hat etwas mit einem neuen Zeilenzeichen oder dem C-String Terminator \0 zu tun. Wie bekomme ich die while-Schleife zu beenden, wenn der Benutzer "Exit" eingibt?

+0

'fgets' lesen * und umfasst * den abschließenden' '\ n'' mit jeder Zeile liest. –

+0

Sie sollten die Schleife auch "brechen", wenn 'fgets'' NULL' zurückgibt. Ohne diese Prüfung geht der Code in eine Endlosschleife, wenn der Benutzer die Tastenkombination drückt, die 'EOF' generiert. Diese Tastenkombination ist control-D auf Unix-Systemen und control-Z auf Windows. – user3386109

+0

Auch nach dem 'malloc' sollten Sie die Zeile' buf [0] = '\ 0' haben; 'Das vermeidet die (extrem unwahrscheinliche) Chance, dass der von' malloc' zurückgegebene Puffer den String '' Exit! '' Enthält. ' – user3386109

Antwort

1

Es ist, weil fgets die newline behält, die von der Tastatur eingegeben wurde, oder markierte das Ende der Zeile in der Textdatei.

Eine einfache Art und Weise zu entfernen, es ist wie folgt:

#include <string.h> 

//... 

buf [ strcspn(buf, "\r\n") ] = 0; // remove trailing newline etc 
+0

Sicher ist das eine schlechte Idee, denn wenn das Muster nicht in der Zeichenkette ist, könnten Sie buf um ein Byte überlaufen? –

+1

@SectoKia ist es völlig sicher. Wenn weder '\ n' noch' \ r' vorhanden sind, überschreibt es den bestehenden Terminator '' \ 0'', andernfalls überschreibt er die erste Übereinstimmung. –