2016-07-30 29 views
-1
char *str; 
while(1) 
{ 
    printf("$$$$>"); 
    scanf("%s",str); 
} 

In diesem Code möchte ich nur eine Eingabeaufforderung drucken. Wenn der Benutzer etwas eingibt, passiert nichts und die Eingabeaufforderung wird erneut gedruckt. Aber die scanf() läuft einmal und dann $$$$> wird in Schleife gedruckt. Der Code wird ausgeführt, wenn ich versuchte, ein Zeichenarray anstelle eines str-Zeigers zu verwenden. warum?mit printf und dann scanf in loop

Antwort

2

Becase Sie nicht auf einen Speicherpuffer, die str zeigen kann zugewiesen hat, fügen Sie diese Zeile unter str decleration:

str=malloc(sizeof(char)*1000); 
+0

' sizeof (char) 'ist immer 1, also fügt es dem Code keinen Wert hinzu. Wenn man den Typ von 'str' abgleichen will, benutzt man einfach' str = malloc (sizeof * str * 1000); ' – chux

+0

Sie sind so falsch ... die Größe von char ist 1, das ist für die Lesbarkeit des Codes ... und str ist eine Adresse, so dass Sie gerade 1000 * Adresse-Wert, die Millionen von Bytes sein können zugeordnet ... und auch müssen Sie nicht "jeden" Typ "übereinstimmen" ... Sie offensichtlich nicht wissen c .. –

+1

Hmmm "offensichtlich nicht wissen, c "-> Siehe [badge] (http://stackoverflow.com/help/badges/96/c?userid=2410359) und" und str ist eine Adresse, also hast du gerade 1000 * address-value "-> no zugewiesen , 1000 mal der _type_ des de-referenzierten 'str' zugewiesen, was in diesem Fall' sizeof * str * 1000' -> '1 * 1000', nicht" kann Millionen von Bytes sein "pro [Kommentar] (http : //stackoverflow.com/questions/38673272/using-printf-and-then-scanf-in-loop/38673321? noredirect = 1 # comment64740319_38673321). Test mit 'printf vorschlagen ("% zu \ n ", sizeof * str * 1000);' – chux

4

char * str;

Sie haben str ohne Initialisierung verwendet. Die Verwendung eines nicht initialisierten Zeigers in einer anderen Funktion wie scanf ist ein Rezept für das Programmabsturz.

Sie können das Problem durch malloc (dynamisch Zuordnen) für str Zeiger beheben, aber für eine solche einfache Verwendung können Sie stattdessen Array verwenden.

char str[100] = ""; 
while(1) 
{ 
    printf("$$$$>"); 
    // scanf("%s",str); // not recommended 
    fgets(str, sizeof(str), stdin); // fgets is better 
} 
+0

@chux einverstanden sind, geändert – artm

+0

Dank für ans. aber ich habe noch zwei Zweifel. was ist der Unterschied b/w char str [100] = ""; und char str [100]; beide geben die gleiche Ausgabe aus] – RaKo

+0

@RavindraKoranga 'str [100] =" ";' stellt sicher, dass die Zeichenfolge vor allen Operationen auf leer initialisiert wird (dh alle Zeichen sind auf 0 gesetzt). Es empfiehlt sich, Variablen vor der Verwendung zu initialisieren. – artm

0

müssen Sie den Speicher auf den String zuweisen, nachdem der Zeiger zu deklarieren. Sie können dies tun, indem Sie malloc- oder calloc-Funktionen verwenden.

char *str = (char*) malloc(sizeof(char) * 100); 

oder

char *str = (char*) calloc(100, sizeof(char)); 
+0

char * str; \t str = (Zeichen *) malloc (Größe von (Zeichen) * 100); fgets (str, sizeof (str), stdin); printf ("% s", str); wenn ich diesen Code austrage, werden nur 7 Zeichen gedruckt, auch wenn ich große Eingaben mache. Kannst du mir den Grund nennen? – RaKo

+0

Ich habe vorher mit Fgets gearbeitet und es hat dann nicht gut für mich funktioniert! Ich werde vorschlagen, fscanf anstelle von fgets zu verwenden. Du kannst es so schreiben fscanf (stdin, "% s", str); –