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()
'scanf ("% d% * c", &N); char Farbe [N] [20]; ' – BLUEPIXY
Zeige mir die genauen drei Eingaben, die du an fputs gibst –
Das Problem ist, dass du' scanf' für Benutzereingaben verwendest – melpomene