2016-05-19 13 views
0

Ich bin neu in C Sprache und arbeite an einem kleinen Programm.Akzeptieren von Leerzeichen in C-String-Eingabe

Eigentlich versuche ich String vom Benutzer mit scanf zu nehmen. Aber immer, wenn ich mit Leerzeichen in die Zeichenkette gebe, läuft das Programm unendlich weiter und ich musste die Stopptaste drücken. Ich habe Beispiele online gesehen und ich habe sie auch benutzt, aber das gibt mir dann einen neuen Fehler.

Hier ist mein Code

struct student s1; 
char input[MAX_NAME_SIZE]; 
printf("Enter name>"); 
scanf("%s",input); 
if(strlen(input) > 10) 
{ 
    int l; 
    for(l = 0 ;l < 10;l++) 
     s1.name[l] = input[l]; 
} 

int error = 0; 
do 
{ 
    if(error == 1) 
     printf("Invalid day. "); 

    printf("Enter birthday: day>"); 
    scanf("%u",&s1.birthday.day); 
    error = 1; 
}while(s1.birthday.day < 1 || s1.birthday.day > 31); //checking the criteria 

Ich habe auch verwendet scanf ("% [^ \ n] s, Eingang), aber es dann die scanf überspringen und mit dem zweiten Scanf gehen.

Bitte Hilfe

+0

Wenn es für immer läuft, dann ist es Ihre Schleife, die das Problem ist. – Takarii

+0

Und wie nennt man das? Bitte geben Sie an, wie Sie das Problem reproduzieren können. Was ist erwartet, was ist das Ergebnis? – 4pie0

+0

So funktioniert ['scanf'] (http://en.cppreference.com/w/c/io/fscanf) mit dem Format"% s ", es liest * Leerzeichen getrennte *" Wörter ". Wenn Sie eine ganze Zeile lesen müssen, gibt es andere Alternativen (http://en.cppreference.com/w/c/io/fgets). Außerdem können Sie mit 'scanf' dem Format Optionen hinzufügen, so dass es nicht zu viele Zeichen lesen und außerhalb der Grenzen Ihres Arrays schreiben kann, ohne dass Sie die 'Strlen'-Prüfung oder das manuelle Kopieren durchführen müssen. –

Antwort

0

Das Problem, wie ich in meinem ersten Kommentar angedeutet, dass scanf nur liest Raum „Worte“ begrenzt.

Das heißt, wenn Sie eine Zeichenfolge mit Leerzeichen als Eingabe angeben, liest scanf den ersten Teil bis zum Leerzeichen und lässt den Rest der Eingabe im Puffer. Dann, wenn Sie Ihre Eingabe in der Schleife machen, wird scanf sehen, dass es keine Zahl ist, und die Eingabe aus dem Puffer nicht zu extrahieren, so dass die Eingabe intakt bleibt, so wird die nächste Iteration der Schleife scanf versuchen, die genaue zu lesen und zu analysieren gleiche Eingabe wie die letzte Iteration, die zu einer Endlosschleife führt.

Es gibt auch andere Probleme mit Ihrem Code, wie Sie nicht wirklich zu überprüfen, ob scanf fehlgeschlagen ist oder nicht (den Link zu a scanf (and family) reference folgen und lesen, was es gibt), und nicht aus der Schleife zu brechen, wenn error eingestellt ist.

1

statt mit

scanf("%s",input); 

können Sie

gets(input); 

verwenden Es ist eine Funktion der cstring Header-Datei und arbeitet gleich. Sie können das Problem erhalten, weil scanf nur durch Leerzeichen getrennte Zeichenfolgen akzeptiert. gets akzeptiert eine komplette einzelne Zeile, so kann es Ihr Problem lösen.

Hoffentlich wird das funktionieren!

EDIT1: Habe es gerade von einem der Kommentare bekommen.

Verwenden Sie stattdessen fgets(). weil gets() keinen Pufferüberlaufschutz bietet.

+0

.... Ja, hoffentlich .... wenn du Glück hast .. – LPs

0

Ich würde Ihnen nie empfehlen, scanf für Eingabe zu verwenden, die mehr als ein Wort ist. getline() wäre die beste Wahl für die Eingabe der gesamten Linie (etc. Mike Myers 13/04/85) und es ist ziemlich sicher. Sie erhalten auch null terminierte Zeichenfolge.

Sie diese Funktion zum Beispiel verwenden können:

char *input(char *output) 
{ 
    char *Buffer = NULL; 
    size_t size = 0; 
    int count = 0; 

    printf("%s", output); 
    count = getline(&Buffer, &size, stdin); 
    Buffer[count-1] = '\0'; 
    return Buffer; 
} 

In Ihrem Fall wäre es am besten, es zu benutzen wie folgt aus:

s1->name=input("Enter the name"); 
s1->birthday=input("Enter the birthday"); 

Oder Sie können die gesamte Zeile und verwenden strtok eingeben () um es zu analysieren.

Verwandte Themen