2017-03-18 3 views
0

Der Code, der diesem Beitrag beigefügt ist, ist Teil eines größeren Programms, aber ich habe Probleme beim Eingeben von Eingaben für meine strukturierte Variable 'Titel' und 'Autor'. Das Programm scheint sich darüber zu bewegen und zur nächsten Zeile überzugehen. Auch wenn ich [^ \ n] vor 's' im String-Spezifizierer verwende, tut es das gleiche, aber ich lese, dass es verwendet wird, um eine Zeichenkette als Eingabe mit scanf zu nehmen. Lesen Sie ein paar Beiträge, aber ich kann das Problem nicht herausfinden. Nur mit C beginnen, jede Hilfe wäre willkommen!Verwenden von scanf für Struktureingabe

struct books{ 
char title[30]; 
char author[30]; 
char subject[20]; 
int quantity; 
int book_id; 
char *category; 
int count; 
float price; 
}; 
struct books book; 

book.book_id=id; 
printf("\n\n\t\tBook Name:\n\t\t"); 
scanf(" %s",book.title); 
printf("\n\n\t\tAuthor:\n\t\t"); 
scanf(" %[^\n]s",book.author); 
printf("\n\n\t\tQuantity:\n\t\t"); 
scanf("%d",&book.quantity); 
printf("\n\n\t\tPrice:\n\t\t"); 
scanf("%f",&book.price); 
+0

Es könnte das Leerzeichen vor% s sein – Luci

+1

Enthält Ihr Format-Spezifizierer tatsächlich '[^ \ n]' und nicht '[^ \ n]'? Sie möchten die zusätzlichen Räume dort auch nicht. Das '[^ \ n]' spezifiziert '\ n' ausdrücklich anstelle eines beliebigen Whitespace als Zeichenfolgebegrenzer. Wenn du das versucht hast, dann ist das der Code, den du gepostet haben solltest. Funktioniert es, wenn die Eingabe keine Leerzeichen enthält oder ist das auch ein Problem? – Clifford

+1

[mcve], bitte! BTW, das 's' nach' [^ \ n] 'ist falsch und sollte entfernt werden. Dies hat zwar keine Auswirkung, ist aber völlig überflüssig. –

Antwort

0

Verwenden [^ \ n] vor 's' in den String-Spezifizierer in sowohl dem Eingang "book.title" und "book.author".

Ich habe Ihren Code mit diesen Änderungen ausgeführt. Der Code ist korrekt.

Sie haben einen Platz getrennt String als Titel des Buches genommen. (wie „Mein Kampf“ als Titel.)

Aber Sie müssen verstehen, dass Sie nicht Eingaberaum können Worte als einzelnen String mit Scanf getrennt. Das Programm springt also darüber und springt zur nächsten Zeile.

solche Eingaben nehmen Sie bekommt oder fgets Funktion oder [^ \ n] vor ‚s‘ im String-Bezeichner verwenden müssen.

+0

bekommt (book.title) macht eigentlich das selbe. Überfliegt den Titel des Autors. –

+0

Sie * können * Zeichenfolgen mit Leerzeichen mit scanf akzeptieren. Sehen Sie sich die Antwort an, die jetzt als Duplikat gekennzeichnet ist. Ob es überhaupt sinnvoll ist, scanf überhaupt für die Eingabe von Strings zu verwenden, ist eine andere Sache. – Clifford

+1

@SyedHasan: Was meinst du mit "Schleifen über"? Ihr Codefragment enthält keine Schleifen. Benutze 'gets()' nicht - noch schlimmer als 'scanf()'! Die Frage, die als doppelt markiert ist, Beispiele mit fgets() und 'scanf()' sind angegeben. – Clifford