2017-06-04 5 views
-2

Dies ist mein Codefgets() funktioniert nicht wie erwartet

int main(){ 
    int N,i,radius,diameter,count =0; 
    char str[20]; 
    char color[N][20]; 
    printf("Get the num : "); 
    scanf("%d",&N); 

    printf("Enter the mesage\n"); 
    for(i=0;i<N;i++){ 
     fgets(color[i],20,stdin); 
    } 
    for(i=0;i<N;i++){ 
     printf("%s",color[i]); 
    } 
    return 0; 
} 

Da Eingänge sind:

N = 3 
red 50, 
50 green, 
blue 50 

Hier ist das Problem fgets innerhalb for-Schleife nur zweimal ausgeführt wird, wenn N 3 Dieses Problem tritt nicht auf, wenn ich die scanf Anweisung kommentiere. Kann mir jemand erklären, was dieses Problem verursacht und wie es gelöst werden kann?

+2

'scanf ("% d% * c", &N); char Farbe [N] [20]; ' – BLUEPIXY

+0

Zeige mir die genauen drei Eingaben, die du an fputs gibst –

+0

Das Problem ist, dass du' scanf' für Benutzereingaben verwendest – melpomene

Antwort

1

Nach ein paar Stunden von meinem Kopf kratzen, erkannte ich folgendes:

  • Vermeiden Sie scanf. Pufferüberläufe zu verwalten ist nicht einfach.
  • Versuchen Sie immer, fgets zu verwenden, um Benutzereingaben zu erhalten.

diesen Code Versuchen Sie es hier:

#include<stdio.h> 
#include<stdlib.h> 
int main(){ 
    int N,i,radius,diameter,count =0; 
    char str[20]; 

    printf("Get the num : "); 

    char buffer[64]; 
    fgets(buffer, 64, stdin); 
    N = strtoul(buffer,NULL,10); 
    char color[N][20]; 

    printf("%d\n",sizeof(color)); 

    printf("Enter the mesage\n"); 

    for(i=0;i<N;i++){ 
     fgets(color[i],20,stdin); 
     if(color[i][strlen(color[i])-1]=='\n'){ 

    color[i][strlen(color[i])-1]='\0'; 
    } 
    else{ 

    while((getchar())!='\n');//this is just to prevent an overflow for the size of char arrays 
    } 

    } 
    for(i=0;i<N;i++){ 
     printf("%s\n",color[i]); 
    } 
    return 0; 
} 

Beachten Sie, dass ich zum ersten Mal Eingabe eine Zahl innerhalb eines char-Array. Konvertiere das in eine Zahl mit strtoul (string to unsigned long). Jetzt innerhalb der for-Schleife verwende ich wieder fgets, um Eingaben zu machen. Das Problem war, wenn Sie eine Zeichenfolge eingeben, die größer als 19 Zeichen ist, wird der verbleibende Teil im Eingabepuffer belassen und der nachfolgenden Eingabe zugewiesen. Um das zu verwalten, habe ich getchar in einer while-Schleife verwendet, die alle unnötigen Zeichen und das Newline-Zeichen aus dem Eingabestream verbraucht. Vermeiden Sie fflush, wie es in undefinierten Verhalten führen kann, wie hier beantwortet

-fflush(stdin) function does not work

-http://www.geeksforgeeks.org/clearing-the-input-buffer-in-cc/

Beachten Sie auch, dass Sie mit variabler Länge Arrays verwenden, die nicht immer eine gute Wahl sein kann. Ältere Versionen des c-Compilers verbieten sie. Du hast zuerst die Farbe [N] [20] erklärt, bevor du N initialisierst. Das war falsch.

Ich schlage vor, Sie dies lesen zu

-C - scanf() vs gets() vs fgets()

+1

'Zeichenfarbe [N] [20];': Sie verwenden eine nicht initialisierte Variable. – BLUEPIXY

+1

Sie verwenden 'N', ohne einen Wert zu setzen. Auch "% [^ \ n]" 'sollte' "% 19 [^ \ n]" ' – BLUEPIXY

+1

Sie sollten einen Pufferüberlauf in' scanf ("% [^ \ n]", color [i]) verhindern; ' – BetaRunner

-2

Aufgrund dieser Referenz: https://www.tutorialspoint.com/c_standard_library/c_function_fgets.htm dies richtig sein:

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    int N, i, radius, diameter, count = 0; 
    char str[10]; 
    char color[20]; 
    printf("Get the num : "); 
    scanf_s("%d", &N); 

    printf("Enter the mesage\n"); 
    //for (i = 0; i<N; i++){ 
     fgets(color, 20, stdin); 
    //} 
    //for (i = 0; i<N; i++){ 
     printf("%s", color); 
    //} 
    return 0; 
} 

I scanf-scanf_s für VC++ geändert.

+0

Ihr Code macht tatsächlich eine andere Sache. – BetaRunner

+0

genau, mein Fehler – fardin

0

Nach der Verwendung von scanf müssen Sie den Puffer reinigen. Ich schlage vor, nie Scanf, nur fgets verwenden verwenden und dann die Ausgabe in eine Zahl konvertieren:

int main(){ 
    int N,i,radius,diameter,count =0; 
    char str[20]; 
    char color[N][20]; 
    printf("Get the num : "); 

    char buffer[64]; 
    fgets(buffer, 64, stdin); 
    N = atoi(buffer); // you need to include stdlib.h 

    printf("Enter the mesage\n"); 
    for(i=0;i<N;i++){ 
     fgets(color[i],20,stdin); 
    } 
    for(i=0;i<N;i++){ 
     printf("%s",color[i]); 
    } 
    return 0; 
} 
+0

Und bevor deklarieren 'char Farbe [N] [20]', müssen Sie sicherstellen, dass "N" hat einen streng positiven (nicht Null, nicht negativ) -Wert - was es nicht, wenn es ist nicht initialisiert. –

Verwandte Themen