2016-12-20 4 views
-3

das ist nur ein einfacher Code, den ich gerade schrieb, und ich verstehe nicht, warum es mir nicht wahr gibt, wenn ich Mutter im Strom schreibe. Es ist logisch für mich, wenn sie sich vergleichen, muss es gleich sein oder?
das ist mein einfacher Code:Zeichenkette vergleichen in c mit fgets

char string[20]; 
fgets(string,20,stdin); 

printf("%s",string); 

if(strcmp(string,"mother")==0) 
{ 
    printf("they are the same"); 
} 
else 
{ 
    printf("they are not"); 
} 

Ich habe versucht, auch mit

if(string =="mother") 
\\do something 

aber es wird nicht nur mir wahr geben kann mir jemand

+1

'fgets' vergleicht keine Strings. Für 'strcmp' spielt es keine Rolle, ** wie ** die Strings erstellt werden. Und was ist mit der Dokumentation der Funktionen, verstehst du nicht? – Olaf

+3

Probieren Sie 'printf (" <%s> \ n ", string);' aus, um zu sehen, was Sie mit 'fgets()' lesen. – chux

+0

'strcmp (String," Mutter \ n ")' – BLUEPIXY

Antwort

3
if(string =="mother") // won't work 

Sie C vergleichen können nicht helfen Strings direkt mit ==. Verwenden Sie Funktion Standardbibliothek strcmp statt

if(0 == strcmp(string, "mother")) 
{ 
    printf("equal"); 
} 

Auch müssen Sie \n von fgets zu entfernen, da sonst der Zeichenfolge Vergleich zu falsch hält.

fgets(string,20,stdin); 
string[strcspn(string, "\n")] = 0; // without this, `strcmp` would return false 
0

Aus der Manpage für fgets():

fgets() reads in at most one less than size characters from stream and 
stores them into the buffer pointed to by s. Reading stops after an 
EOF or a newline. If a newline is read, it is stored into the buffer. 
A terminating null byte ('\0') is stored after the last character in 
the buffer. 

Haben Sie überprüft, ob es ein Newline-Zeichen auf Ihre Eingabe angehängt ist? "mother" ist nicht dasselbe wie "mother\n".

0

fgets entfernt nicht die neue Zeile (\n) vom Eingang. Sie sollten es (falls vorhanden) entfernen, bevor die Saiten zu vergleichen:

char string[20]; 
fgets(string,20,stdin); 

int len = strlen(string); 
// len-1 is the last character before the original \0 
if(len > 0 && string[len-1] == '\n'){ 
    // remove the new-line by ending the string sooner 
    string[len-1] = '\0'; 
} 

if(strcmp(string,"mother")==0) 

Ihren zweiten Versuch, den Vergleich von zwei Strings mit == direkt funktioniert definitiv nicht.

+2

Schlagen Sie 'if (len> 1' ->' if (len> 0' – chux

1

Wie andere bereits gesagt haben, können Strings nicht mit == verglichen werden. Damit Ihr Code funktioniert, müssen Sie das Zeichen \n von fgets() entfernen. Ansonsten vergleichen Sie:

if (strcmp("mother\n", "mother") == 0) { 

Welche wird immer falsch sein, wenn Sie die \n Zeichen entfernen.

Da fgets() kehrt NULL, wenn nicht erfolgreich, wenn eine Eingabe vom Benutzer zu lesen, ist es auch sicher ist, dass zu überprüfen, wie folgt aus:

if (fgets(string, 20, stdin) == NULL) { 
    /* Exit program */ 
} 

Sie auch für einige zusätzliche Fehlerprüfung für fgets(), wie etwa die Überprüfung hinzufügen Pufferüberlauf, der wie folgt überprüft werden kann:

slen = strlen(string); 
if (slen > 0) { 
    if (string[slen-1] == '\n') { 
     string[slen-1] = '\0'; 
    } else { 
     /* Exit program */ 
    } 
} 

Nach diesen Überlegungen kann Ihr Code möglicherweise wie folgt aussehen:

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

#define BUFFSIZE 20 

int 
main(int argc, char *argv[]) { 
    char string[BUFFSIZE]; 
    size_t slen; 
    const char *compare = "mother"; 

    printf("Enter a string: "); 
    if (fgets(string, BUFFSIZE, stdin) == NULL) { 
     printf("Error reading string into buffer.\n"); 
     exit(EXIT_FAILURE); 
    } 

    slen = strlen(string); 
    if (slen > 0) { 
     if (string[slen-1] == '\n') { 
      string[slen-1] = '\0'; 
     } else { 
      printf("Buffer overflow. Exceeded buffer size of %d.\n", BUFFSIZE); 
      exit(EXIT_FAILURE); 
     } 
    } 

    if (!*string) { 
     printf("No string entered.\n"); 
     exit(EXIT_FAILURE); 
    } 

    printf("My string = %s.\n", string); 
    if (strcmp(string, compare) == 0) { 
     printf("They are the same.\n"); 
    } else { 
     printf("They are not the same.\n"); 
    } 

    return 0; 
}