2010-12-09 12 views
4

Ich habe diesen einfachen C-Code in Microsoft Visual C++ 2010.Warum generiert dieser c-Code keine erwartete Ausgabe?

#include<stdio.h> 
    #include<conio.h> 
    void main() 
    { 
    char title[20], artist[30]; 
    int numtrack, price; 
    char type; 

    printf("Enter the title of CD \n"); 
    scanf("%s",title); 
    printf("\nName of the artist \n"); 
    scanf("%s",artist); 
    printf("\nEnter the type of CD(enter a for album and s for single)\n"); 
    scanf("%c",&type); 
    printf("\n Enter the number of tracks \n"); 
    scanf("%d", &numtrack); 
    printf("\n Enter the price of the cd \n"); 
    scanf("%d", &price); 
    printf("%s\n%s\n%c\n%d\n%d\n",title, artist, type, numtrack, price); 
    getch(); 
    } 

Es ist außer Betrieb gesetzt ist für Typ-Variable für die Eingabe

Enter the title of CD 
ranjit 

Name of the artist 
mahanti 

Enter the type of CD(enter a for album and s for single) 

Enter the number of tracks 

4 

Enter the price of the cd 
4 
ranjit 
mahanti 


4 
4 

Ich kann nicht verstehen, warum es nicht wartet geschrieben? Kann mir das bitte jemand erklären? Danke im Voraus.

Antwort

7

Statt

scanf("%c",&type); 

wollen Sie

scanf(" %c",&type); 

Andernfalls eine der Zeilenumbrüche aus dem vorherigen Zeichenfolge wird als Typ verbraucht werden.

+1

für Typen verarbeitet werden, aber können Sie mir die Logik bitte erklären? wenn ich das Extra \ n entfernt habe, warum wurde das Problem nicht gelöst? – narayanpatra

+4

Das führende Leerzeichen in der scanf-Musterzeichenfolge verursacht, dass scanf alle Leerzeichen (Leerzeichen/Zeilenumbrüche/Tabs/etc) verbraucht, bevor das Zeichen gelesen wird, das in 'type' gespeichert werden soll. Das '% s'-Mustertoken überspringt Whitespace und liest eine Zeichenkette, dann * stop * bei Whitespace (eine Newline), ** ** verbraucht jedoch nicht den Whitespace ** und belässt es im Eingabepuffer. Sie müssen daher dieses Leerzeichen überspringen; das Leerzeichen vor '% c' wird das tun. – cdhowie

+0

Danke für die Hilfe. Ich habe es verstanden. – narayanpatra

0

Wenn Sie scanf zum Einlesen einer Zeichenfolge verwenden, liest es nur ein einzelnes Wort ein. Dieses einzelne Wort schließt das Newline-Zeichen ("\n") aus. Wenn Sie dies durch scanf verfolgen, um ein einzelnes Zeichen zu lesen, wie Sie mit type tun, wird das Newline-Zeichen das Zeichen sein, das gelesen wird.

Sie können dieses Problem beheben, indem ein Leerzeichen vor den %c Zugabe, die jede Leerzeichen ignoriert (siehe http://www.cplusplus.com/reference/clibrary/cstdio/scanf/): scanf(" %c",&type)

+0

-1 Dies wird auf Betriebssystemen, bei denen das Zeilenumbruchmuster CRLF ist, kläglich scheitern. – cdhowie

+0

Ich entfernte die \ n und überprüft, nicht funktioniert. – narayanpatra

+0

@cdhowie Ich war gerade beschäftigt, das zu bearbeiten: P @ r.s.mahanti Versuchen Sie das Update. – marcog

0

ein getchar() nach scanf("%s",artist); hinzufügen, so dass die zusätzlichen \n (oder \r\n) verbraucht wird .

+0

Was ist mit Betriebssystemen, die das "\ r \ n" -Muster für Zeilenumbrüche verwenden? – cdhowie

+0

@cdhowie: Hmm gültiger Punkt. –

+0

Für Betriebssysteme, die "\ r \ n" verwenden, hat stdin dies bereits in \ n konvertiert. – Joshua

0

Die ‚\ n‘ aus dem vorherigen scanf ist

Das funktionierte
Verwandte Themen