2016-11-12 3 views
0

Ich übe derzeit auf Struct, und hier ist mein einfacher Code. Ich habe gerade ein Problem hier, dass ich die Antwort nicht finden konnte. Mein Code fordert mich auf, den Namen eines Songs, dessen Interpret und die Dauer des Songs einzugeben. Ich tippte "My Lightning Speed", aber nur das Wort "My" füllt den Namen des Songs. Das Wort "Lightning" füllt den Künstler und Speed ​​füllt die Dauer. Warum? Wie kann ich es reparieren?Warum kann ich keine Zeichenfolge mit Leerzeichen eingeben?

#define _CRT_SECURE_NO_WARNINGS 
#include <string.h> 
#include <stdio.h> 
#define SIZE 20 

typedef struct { 
    char name[SIZE]; 
    char artist[SIZE]; 
    int duration; 
} songname; 

songname FillSong(); 

int main() 
{ 
    songname songNumb1, songNumb2, songNumb3; 

    songNumb1 = FillSong(); 
    songNumb2 = FillSong(); 

    return 0; 
} 

songname FillSong() 
{ 
    songname tempC; 

    printf("\n"); 
    printf("Enter the name of this song: "); 
    scanf(" %s", tempC.name); 
    printf("name: %s\n", tempC.name); 

    printf("Who is the artist? "); 
    scanf(" %s", tempC.artist); 
    printf("artist: %s\n", tempC.artist); 

    printf("What is the duration(seconds)? "); 
    scanf("%d", &tempC.duration); 
    printf("duration: %d\n", tempC.duration); 

    return tempC; 
} 
+3

Haben Sie die Manpage für 'scanf' gelesen? –

+0

Mmm Darf ich fragen, was die Manpage ist? – user6866732

+0

Sie geben "man page scanf" in Google ein. –

Antwort

0

Standardmäßig wird scanf zuerst auf Nicht-Leerzeichen lesen. Betrachten Sie das Lesen einer ganzen Textzeile für den Namen des Liedes oder irgendetwas, wo sich Leerzeichen im Namen befinden könnten.

Es kann einige Fälle geben, wenn Sie ein Komma oder Semikolon getrennt Feld haben wollen, die in https://stackoverflow.com/a/40568616/5675174 Ausdruck gegeben werden

0

Die scanf für solche Fälle helfen() funtion stoppt, wenn eine neue Zeile oder einen weiße Lese Leerzeichen wird erkannt, wenn Sie eine Zeichenfolge mit Leerzeichen eingeben möchten, indem Sie die Funktion gets() verwenden.

Syntax: gets (Variablenname);

Die Get-Funktion stoppt die Eingabe nur, wenn eine neue Zeile eingegeben wird.

+1

Geben Sie nie 'gets()' als Lösung für ein Problem auf SO. Lesen [Warum 'wird()' ist zu gefährlich, um benutzt zu werden - je] (http://stackoverflow.com/questions/1694036/why-is-the-gets-function-dangerous-why-should-it-not- verwendet werden). –

3

scanf überspringt den Leerraum (Leerzeichen, Tabulatoren, Zeilenumbrüche usw.) beim Lesen der Eingabe. Um Eingaben lesen zu können, deren Format nicht festgelegt ist, empfiehlt es sich oft, eine Zeile nach der anderen zu lesen.

Bitte lesen Sie "Die C-Programmiersprache" von Brian W. Kernighan und Dennis M. Ritchie, um mehr zu erfahren.

Verwandte Themen