Lesen Sie sorgfältigscanf(3). Beachten Sie, dass Sie mit gcc -m32
sizeof(userInput)
gleich 4 haben (die Größe aller Zeiger ist gleich; ohne die -m32
wäre es 8). Also, wenn der Benutzer etwas wie working
(oder eine Eingabe von vier oder mehr Zeichen, nicht nur einen Buchstaben wie a
) eingibt, haben Sie undefined behavior (wegen einer buffer overflow) und das ist wirklich bad. Sie sollten wahrscheinlich stattdessen verwenden (oder vielleicht sogar readline(3)), z.
char* userInput=NULL;
size_t sizeInput= 0;
printf("Commands:\n");
/// put your other printfs here, then
ssize_t lengthInput = getline(&userInput, &sizeInput, stdin);
if (lengthInput < 0 || userInput==NULL)
{ perror("input error"); exit(EXIT_NULL); };
Jetzt haben Sie die gesamte typisierten Linie in userInput
(einschließlich des abschließenden Newline), und Sie wissen, dass seine Länge lengthInput
ist. Sie können parse diese Zeile, vielleicht mit sscanf(3) (Hinweis: Verwenden Sie die Anzahl der Rücksendungen, und verwenden Sie %n
) oder nur mit anderen Techniken (einige strcmp
oder strtok(3) ...). Wenn Sie fertig sind, sollten Sie free(userInput)
.
Beachten Sie, dass scanf
(oder sscanf
) keinen Speicher für geparste Daten zuweisen, außer Sie verwenden %ms
(was wahrscheinlich POSIX-spezifisch ist). Mit %s
erwartet es immer einige feste Länge Puffer und für eine Array Puffer erklärt char buf[64];
Sie geben besser die Größe mit %63s
; BTW, sollten Sie immer die Ergebnisanzahl von scanf
testen. So könnte Code, den Sie (nach dem oben)
char nambuf[64];
if (sscanf(userInput, "a %63s", nambuf)==1) {
// use nambuf to add it
}
else if (sscanf(userInput, "r %63s", nambuf)==1) {
// use nambuf to remove it
}
(aber die oben ist ein bisschen dumm, lesen wir eine beliebige Größe Linie, sondern Prozess nambuf
von höchstens 63 Bytes). Sie könnten einfach scanf
wie if (scanf("a %63s", nambuf)==1)
ohne userInput
verwenden.
Alternativ können Sie den Linux-spezifische %as
oder besser verwenden die POSIX-spezifische %ms
wie:
char* nameptr=NULL;
if (scanf("a %ms", &nameptr)==1) {
dann, dass eine erfolgreiche scanf
malloc
-ed haben würde und gefüllt nameptr
und Sie sollten später free(nameptr)
. Wenn Sie nur Kleinbuchstaben annehmen möchten etwas betrachten Codierung wie if (scanf("a %m[a-z]", &nameptr)==1)
etc ...
Verwenden Sie den 'gdb' Debugger Ihr Programm Schritt für Schritt ausgeführt werden. –
Willkommen bei Stack Overflow! [Bitte lesen Sie die Diskussion darüber, warum der Rückgabewert von 'malloc()' und die Familie in 'C' nicht umgewandelt werden soll.] (Http://stackoverflow.com/q/605845/2173917). –
Hinweis: '\ n' ist für Wagenrücklauf. Sehen Sie in https://www.tutorialspoint.com/c_standard_library/c_function_scanf.htm ein '\ n'? –