2016-11-28 4 views
2

Ich bin ein Programm zu bauen, die Eingabe vom Benutzer in Form von Befehl wie "Befehl 12" lesen müssen, wo Befehl ist ein bestimmtes Wort und muss in separaten Variablen, Nummer danach gespeichert werden muss auch in seiner Variable sein.Überprüfen Sie, ob Eingabe entspricht Wort in C

Ich erstellte Variable, in der Wort ist, das die Variable des Befehls und des int für das Speichern zusammenbringen muss.

char rule[5] = {'r', 'u', 'l', 'e', '\0'}; 
char command[6]; 
int cmd_num; 

Und dann scanf verwendet, um es zu lesen und dann durch strcmp zu vergleichen.

scanf("%s %d", &command, &cmd_num); 
if ((strcmp(command, rule)) != 0) 
{ 
    printf("Error.\n"); 
    return 1; 
} 

Aber es funktioniert nicht, wie ich es erwarten würde. Ich habe stundenlang gegoogelt, aber ich bin nicht in der Lage zu finden, wie man diese Schnur und die Nummer danach richtig speichert. Kann mir jemand helfen zu verstehen, wie die Saite gespeichert ist? Es würde mir helfen zu verstehen, warum strcmp nicht so funktioniert, wie ich es erwarten würde.

Oder gibt es eine bessere Möglichkeit zu überprüfen, ob Benutzereingaben zu bestimmten Wörtern passen? Die Zahl danach scheint mir ein Problem zu sein. Ich habe versucht, mit gets Funktionen herumzuspielen, aber ich konnte nicht zu Ergebnissen kommen. Vielen Dank im Voraus.

Antwort

2

Erstens können Sie direkt rule als Zeichenfolge mit doppelten Anführungszeichen definieren (und zu vermeiden, in sie zu schreiben, es ist ein konstanter Zeiger machen):

const char *rule = "rule"; 
char command[6]; 
int cmd_num; 

Wenn Sie scanf verwenden, Grenzlänge zu vermeiden lesen Pufferüberläufe (unter Verwendung von %5s die minus Null-Terminator die maximale Größe des Arrays ist) und nicht passieren Adresse für Arrays/Zeiger, weil scanf bereits die Adresse der Zeichenkette in schreiben zugreifen kann:

nb_items = scanf("%5s %d", command, &cmd_num); 

Beachten Sie, dass Sie wissen, wie viele Artikel gescannt wurden (deklarieren Sie int nb_items;). Wenn der Benutzer beispielsweise vergisst, eine Zahl einzugeben oder eine Nicht-Nummer einzugeben, erhalten Sie nb_items==1 und Sie werden wissen, dass cmd_num nicht initialisiert wurde.

Das Hauptproblem hier ist, dass Sie undefiniertes Verhalten hatten, das Ergebnis Ihrer scanf in der Adresse der Adresse des Arrays zu speichern.

+0

Ich habe versucht, Limit für scanf (% 5s) zu verwenden, das Problem ist, dass ich zwei Befehle habe, ich weiß nicht, welche der Benutzer eingeben wird, und ich muss sie beide erkennen und leider sind sie nicht das Gleiche Länge – Pernick

+0

dann ist Ihr 'Befehl' Puffer zu klein. Erhöhe es auf die größte Befehlslänge. Wenn Sie Ihren Puffer nicht überprüfen, könnte Ihr Programm abstürzen. 5 ist die maximale Grenze. Sie müssen nicht 5 Zeichen eingeben. –

+0

Ich habe versucht, aber dann strcmp funktioniert nicht, könnte es nicht sein, weil die Zeichenfolgen nicht gleich sind? Nehmen wir an, meine Eingabe ist 'Raven 12' und ich habe const char * raven = "raven"; Wenn ich strcmp für diese beiden verwende, funktioniert es nicht, auch wenn ich sie drucke, sie drucken die gleiche Zeichenfolge. – Pernick

Verwandte Themen