2016-06-21 5 views
0

Ich verstehe nicht, was mit diesem Teil des Programmcodes falsch ist. Ich benutze eine Weile cicle, um den Benutzer zu bitten, eine Zeichenfolge einzufügen, die in einer temporären (char * name) Zeichenfolge gespeichert und dann als Argument einer Funktion übergeben wird. Das Problem ist jedoch, wenn ich scanf Funktion verwende. Dies ist der Code:Probleme mit scanf und Strings in einer While-Schleife

char *name; 
size_t i=0; 

while(i<size){ 
    printf("Insert #%zu item name: ",i+1); 
    scanf("%s",name); 
    printf("Insert #%zu item price: ",i+1); 
    scanf("%u",&price); 
    item=item_cons(item,name,price); 
    i++; 
} 
+0

'Aber das Problem ist, wenn ich scanf verwenden function' was ist es? –

+0

Oh sorry ich vergesse das einzufügen. Ok, das ist das Problem: Wenn ich die Zeichenkette einfüge, die es für (Größe) druckt, füge mal 1-2-3-4 -...- Größe ein und füge 1.Size Artikelpreis ein – Gio

Antwort

2

In Ihrem Code

scanf("%s",name); 

Sie Speicher reservieren nicht für name, der Zeiger. Es zeigt auf ungültigen Speicherplatz und versuchen, es zu verwenden, um einen Wert zu speichern, ruft undefined behavior auf.

Sie müssen Speicher zu name reservieren, bevor Sie das verwenden können, um alles in dem Speicher zu speichern, der von es angezeigt wird. Sie können entweder

  • machen name ein Array, wie char name[32] = {0}; und dann verwenden, wie scanf("%31s",name); (Regel bevorzugt)

oder

  • zuzuteilen dynamischen Speicher zu char *name, unter Verwendung von malloc() oder Familie.
+0

Das ist richtig? name = malloc (sizeof (name) * size); – Gio

+0

Ich verwendete name = malloc (sizeof (char *) * size); und es funktioniert Danke! – Gio

+0

@Gio Nein, es sieht nicht so aus, als könnten Sie lieber 'name = malloc (sizeof (* name) * size);' Anmerkung: 1) Sie müssen auf Erfolg von 'malloc()' 2) Sie überprüfen Ich muss die Erinnerung danach befreien. Was ist das Problem mit dem Array? –

0

try char name [100] verwenden = { '\ 0'} dies setzt voraus, dass der größere Name, den Sie ist 10 erhalten wird

+0

Fügen Sie einige Erklärungen mit der Antwort hinzu, wie diese Antwort OP hilft, das aktuelle Problem zu beheben –