2016-03-29 6 views
2
#include<stdio.h> 
#include<string.h> 
#include<stdlib.h> 

int main() 
{ 

const int SIZE = 100; 

char input[SIZE]; 

while(1) 
{ 
    fgets (input, SIZE - 2, stdin);   // input 
    printf("%d", strcmp(input, "exit")); //returining 10 instead of 0 

    if(strcmp(input, "exit") == 0) 
    { 
     printf("SHELL Terminated\n"); 
     exit(0);  
    } 

return 0; 
} 

Ich stehe vor einem Problem. Wenn ich Ausfahrt in input Variable eingeben, die Funktion strcmp() kehrt 10, aber es sollte 0 zurückkehren und beenden Sie das Programm als Ausfahrt ist gleich Ausfahrt. Aber das tut es nicht.C - Strcmp() funktioniert nicht

Ich kann das Problem nicht finden.

+2

Sie haben versucht, zuerst Ihre 'input' variablen Druck? –

+3

Warum 'SIZE - 2'? – Downvoter

+0

@cad Leerzeichen für Nullzeichen ... –

Antwort

5

fgets hängt ein Zeilenumbruchzeichen (\n) an das Ende der Zeichenfolge, die in den Puffer gelesen wird.

es

char* newline = strchr(input, '\n'); 
if (newline) 
    *newline = '\0'; 

As @WeatherVane mentioned, einige Anrufe von fgets mit Löschen möglicherweise nicht eine neue Zeile in dem Puffer gesetzt, so müssen wir, wenn strchr kehrt NULL (kein Newline gefunden) überprüfen.

+0

Diese Methode wird abgebrochen, wenn die letzte Zeile einer Datei nicht 'newline' hat oder wenn der an 'fgets' übergebene Eingabepuffer kürzer als die Länge der Textzeile war. –

+0

@ WeatherVane Korrigiert. – Downvoter

+0

@ WeatherVane Fixed (?). – Downvoter

8

Sie erhalten 10, weil in Ihrer Eingabezeichenfolge ein Zeilenumbruchzeichen vorhanden ist. Der 10 Rückgabewert ist die Differenz zwischen dem ASCII-Wert dieses Zeilenumbruchzeichens und dem abschließenden Nullzeichen des "exit" Zeichenfolgenliterals, mit dem Sie vergleichen.

6

Funktion fgets enthält auch das neue Zeilenzeichen '\n', das zum Beispiel der gedrückten Eingabetaste entspricht, wenn im Array genügend Platz ist.

Sie sollten es beispielsweise entfernen Sie die folgende Art und Weise

fgets(input, SIZE, stdin); 
input[strcspn(input, "\n")] = '\0'; 

oder sicherer

if (fgets(input, SIZE, stdin) != NULL) input[strcspn(input, "\n")] = '\0'; 

berücksichtigen, dass dieser Code

*strchr(input, '\n') = '\0'; 

im Allgemeinen, weil die neue ungültig Zeilenzeichen kann im Array fehlen und die Funktion wird retu rn NULL.

4

fgets() hält die '\n'. Sie entweder entfernen Sie es aus input (andere Antworten sehen) oder fügen Sie es dem wörtlichen

strcmp(input, "exit\n")