2017-03-13 5 views
2

Als Anfänger habe ich mit einigen der Funktionen der Bibliothek string.h gespielt und habe einige Probleme bezüglich der Funktion strcmp.C: Arbeiten mit strcmp

Ich schrieb das Programm zwei Strings verglichen. Wenn sie gleich sind, gibt es andernfalls YES und NO zurück.

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

int main() { 

    char a[100]; 
    char b[15] = "hello"; 

    fgets(a, 100, stdin); 

    int compare; 

    compare = strcmp(a, b); 

    if(compare == 0) { 

     printf("YES"); 
    } 
    else { 

     printf("NO"); 
    } 

    return 0; 
} 

Nachdem es noch läuft, wenn ich Eingabe von der Tastatur ein hello ich eine NO bekommen. Wenn ich die Zeile printf("%d", compare) anschließe, stellt sich heraus, dass ich für irgendeinen Eingang eine 1 bekomme, das heißt, das Stoppzeichen in a ist größer als das in b.

Wo ist mein Fehler?

+4

Das Problem ist nicht mit 'strcmp' die Zeichenfolge mit einer anderen Zeichenfolge die folgende Art und Weise zu vergleichen, sondern mit dem, was [' fgets'] (http://en.cppreference.com/w/c/io/fgets) funktioniert und wie es funktioniert. –

+0

Es funktioniert mit gcc on tio. Sie können [versuchen Sie es hier] (https: // tio.run/Nexus/c-gcC# bY @ @ xDoMgEIZ3nuJCF0xMg0Mna7eu7dCpMQ6IqCSABnFqfHYLarRDb DCf9/d/TefpOFqrARcB1fJ7tze0K9kpWmChqRxoJk0JIIPQuCDt8wCyxNKi/QQyjy5FJABboVSHU5Xtm6EGwiLwdMxhE0m2kphMO90z6zYlO3nh/j9XPehr9zxmuz1DOjuJkTv3bqa4Pf9haPV07S8Qg3iH/h4HtySrHCjNUBTNM3zcsEX). – izlin

+1

@izlin: Das würde bedeuten, dass tio keine kompatible Standardbibliothek zur Verfügung stellt. – Olaf

Antwort

4

fgets hängt das neue Zeilenzeichen entsprechend der Eingabetaste an, wenn im Quell-Array genügend Platz ist.

sollten Sie das Zeichen entfernen, bevor

a[strcspn(a, "\n")] = '\0'; 

Zum Beispiel

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

int main() { 

    char a[100]; 
    char b[15] = "hello"; 

    fgets(a, 100, stdin); 

    a[strcspn(a, "\n")] = '\0'; 

    int compare; 

    compare = strcmp(a, b); 

    if(compare == 0) { 

     printf("YES"); 
    } 
    else { 

     printf("NO"); 
    } 

    return 0; 
} 
4

fgets(a, 100, stdin); speichert den eingegebenen Zeilenvorschub auch im Puffer. Als solche enthält a"hello\n". Dieses zusätzliche Zeichen gleicht den Vergleich aus.

Sie können entweder versuchen, die Newline auf irgendeine Weise zu entfernen , oder mit strncmp vergleichen.


  1. Zum Beispiel:

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

Es ist kein Fehler beim Scannen als solche, aber das Problem ist, fgets() scannt und speichert die folgende Zeilenschaltung in den mitgelieferten Puffer. Sie müssen das entfernen, falls Sie den Puffer mit einem String-Literal vergleichen, das nicht den abschließenden Zeilenumbruch als Teil enthält.

Für die Newline Strippen Sie so etwas wie

size_t len = strlen(a); 
if (len > 0 && a[len-1] == '\n') { 
    a[--len] = '\0'; 
} 

See this answer for more reference

Ohne Striping über das Newline verwenden können, strcmp() den Vergleich als Erfolg nicht bekannt geben.

Andernfalls können Sie strncmp() verwenden und die Größe des Zeichenfolgenliterals angeben, damit der Vergleich auf den gültigen-Eingang beschränkt bleibt.

+1

'strncmp()' ist nicht gut, es sei denn, Sie überprüfen auch die Länge der Eingabe-Zeichenfolge, um sicherzustellen, dass es so kurz ist wie die Zeichenfolge wörtlich (zum Beispiel) "hallo" und "Hallo Tschüß" würde gleich vergleichen. – JeremyP

+0

@JeremyP Ja, natürlich, warum habe ich erwähnt _ "begrenzt auf die gültige Eingabe" _ –