2017-12-17 1 views
0

Hier ist mein Code vergleichen:die Funktion strcmp Mit Hilfe eines Zeigers und einen String

printf("Please input a command\n"); 

    char *input; 
    input = malloc(sizeof(char) * 50); 

    if(fgets(input, 50, stdin) != NULL) { 
    if(strcmp(input, "end\0") == 0) { 
     printf("END"); 
    } 
    } 

Aus irgendeinem Grund, wenn ich Eingabe ‚Ende‘, ist es nicht „END“ kann nicht gedruckt werden. Was ist das Problem, das den Schleifenzustand verursacht? strcmp(input, "end\0") == 0 Sollte 0 zurückgegeben werden, wenn der Eingabezeiger gleich "end\0" ist? Ich habe auch versucht strcmp(input, "end") == 0 und dies funktioniert auch nicht. Wie kann ich das beheben?

+0

Das hat funktioniert! Vielen Dank für die schnelle Antwort – andydydyy

+0

BTW: In '" end \ 0 "', '\ 0'hat keine Bedeutung in Ihrem Programm. –

+0

Anzähliges Duplikat. Bitte versuchen Sie es nächstes Mal mit Google. –

Antwort

1

fgets enthält die Newline. Verwenden Sie strcmp(input, "end\n")

Aus der Dokumentation:

Liest Zeichen aus dem Stream und speichert sie als C-String in str bis (num-1) Zeichen gelesen wurden oder entweder ein Neue-Zeile oder die End-of-Datei erreicht ist, je nachdem, was zuerst eintritt.

Ein Newline-Zeichen bewirkt, dass Fgets den Lesevorgang stoppen, aber es wird von der Funktion als gültiges Zeichen betrachtet und in der Zeichenfolge enthalten, die nach str kopiert wurde.

Und wie in den Kommentaren erwähnt, brauchen Sie nicht \0 enthalten, wenn Stringliterale verwenden. Der Nullabschluss wird automatisch hinzugefügt.

0

könnten Sie Zeilenumbrüche Streifen \ r \ n, bevor die Zeichenfolge zu vergleichen:

int length = strlen(input); 

if(length>0 && input[length-1]=='\n') { 
    input[length-1]='\0'; 
    length--; 
} 
if(length>0 && input[length-1]=='\r') { 
    input[length-1]='\0'; 
    length--; 
} 

Dieser Code sollte für Windows Linux und Mac universal sein. Als nächstes habe ich unsichere Funktionen wie strlen und strcmp in meinem Beispiel verwendet, gibt es auch strncmp, die nur angegebene Anzahl von Bytes vergleicht.

+1

Die Idee ist gut, aber Sie können das gleiche tun mit 'size_t length = strcspn (input," \ r \ n "); Eingabe [Länge] = '\ 0'; '. –

Verwandte Themen