2017-02-21 1 views
0

Ich habe gerade ein einfaches Programm in C versucht, Einfügen in ein Array. Ich habe eine scanf Funktion verwendet, um Zeichen zu akzeptieren, aber es scheint, dass der Compiler das einfach übersprungen hat und einfach zum Ende des Programms gegangen ist. Diese war der Code, die ich verwendet: -scanf Funktion funktioniert nicht mit Zeichen

#include <stdio.h> 

void main() 
{ 
    int a[50], i, j, m, n, x; 
    char ch; 
    printf("Enter the no. elements of the array :- "); 
    scanf("%d", &m); 
    printf("Enter the elements below :- "); 
    for (i = 0; i < m; i++) 
    { 
     scanf("%d", &a[i]); 
    } 
    printf("The array is :- \n"); 
    for (i = 0; i < m; i++) 
    { 
     printf("%d", a[i]); 
    } 
    printf("\nDo you want to enter an element ? (Y/N)\n"); 
    scanf("%c", &ch);  // The compiler just skips this along with the  
    while (ch == 'y' || ch == 'Y') // while loop and goes straight to the printf 
    {     // statement 
     printf("The index of the element :- "); 
     scanf("%d", &n); 
     printf("\nEnter a number :- "); 
     scanf("%d", &x); 
     for (i = m; i > n; i--) 
     { 
      a[i] = a[i - 1]; 
     } 
     a[n] = x; 
     printf("\nInsert more numbers ? (Y/N)"); 
     scanf("%c", &ch); 
     m = m + 1; 
    } 
    printf("\nThe array is :- "); 
    for (i = 0; i < m; i++) 
    { 
     printf("%d", a[i]); 
    } 
} 

verwendete ich die variable ch, um dem Benutzer zu ermöglichen, eine Wahl zu haben, ob oder ob nicht auf Elemente einzufügen d.h. Y oder N.

Aber der Compiler überspringt grundsätzlich die dritte scanf Funktion, die, die die char akzeptiert, zusammen mit der while Schleife.

Ich möchte nur wissen, warum die scanf Funktion übersprungen wurde?

+2

Ändern Sie 'scanf ("% c ", &ch);' in 'scanf ("% c ", &ch);'), um den im Puffer verbliebenen Zeilenumbruch zu verwenden. Im Gegensatz zu anderen Formaten überspringt '% c' Leerzeichen im Eingabepuffer nicht automatisch. –

+3

Mögliches Duplikat von [Scanf Skip scanning character] (http://stackoverflow.com/questions/36281871/scanf-skip-scanning-character) – EOF

+0

.... und bitte poste gut eingerückt code ... – LPs

Antwort

5

Zurück zum vorherigen scanf, der das letzte Array-Mitglied ist.

scanf("%d",&a[i]) 

In der Eingabedatei, wenn Sie gemacht haben:

32\n 
^^ 

Eingang kurz vor dem Newline wartet, nachdem die Dezimalzahl zu lesen.

Im scanf das Problem verursacht:

scanf("%c", &ch); 

Es wird die Newline-Zeichen zu lesen, wie es verfügbar in Eingang ist Deshalb ist es die Zeile überspringen wird nach implizit ausgeführt wird.

Um den Leerraum zu ignorieren, müssen Sie nur Platz vor dem Spezifizierer %c hinzufügen, wie im Kommentar von @xing und @WeatherVane angegeben.

scanf(" %c",&ch); 

C99 7.19.6.2

Eingangsleerraumzeichen (wie durch die isspace Funktion angegeben) sind übersprungen, es sei denn, Die Spezifikation enthält eine [, c oder n specifier.250)

+1

Gute Antwort +1. Aber betrachten Sie Tonnen der vorherigen Antworten als Duplikat – LPs

+0

10 Diese Frage ist auch doppelt, aber es scheint, dass es kein gutes Verständnis von 'scanf' von OP –

+0

" Es wird das Newline-Zeichen lesen, wie es in Eingabe verfügbar ist, weshalb es überspringen wird it. Die Whitespaces ignorieren "Das habe ich nicht ganz verstanden. Könnten Sie bitte erläutern, warum die scanf-Funktion skippt, da ein \ n davor vorhanden ist. – steve