2016-11-30 10 views
-6

Fall 1: Wenn ich String-Eingang nehmen, sie erfolgreich die Ausgabe gibt, dieses Stück Code zu schreiben:Unerwartete Ausgabe von printf für eine Zeichenfolge in C

#include <stdio.h> 
int main() 
{ 
    char *str; 
    scanf("%s",&str); 
    printf("%s",&str); 
    return 0; 
} 

Fall 2: Auf der anderen Seite, es wirft einen Laufzeitfehler für diesen Schnipsel:

#include <stdio.h> 
int main() 
{ 
    char *str; 
    scanf("%s",&str); 
    printf("%s",str); 
    return 0; 
} 

ich dieses Ding eigentümlich gefunden, und will wissen, warum es passiert ... Vielen Dank im Voraus.

+5

Lesen Sie mehr über ** Strings **, ** Zeiger ** ** ** Arrays und ** dynamische Speicherzuweisung ** zusammen mit ** Formatspezifikation **. Fügen Sie Kirsche auf Kuchen hinzu, indem Sie über * undefined Verhalten * lesen. – haccks

+1

Etwas hier fehlt es an Speicher und das ist 'str'. –

+0

Abgesehen davon, dass Sie Speicher für 'str' nicht reserviert haben, ist Fall 2 die korrekte Implementierung. Fügen Sie vor der Verwendung ein 'str = malloc (50);' oder ähnliches hinzu. Sie haben Glück im Fall 1 und nur eine Erinnerung, die Ihnen nicht gehört. – eddiem

Antwort

2

Keiner dieser beiden Fälle ist richtig.

Fall 1 funktionierte nur, weil Sie durch Angabe eine kurze Zeichenfolge als Eingabe, wahrscheinlich Glück haben. Versuchen Sie etwas wie "bfjabfabjkbfjkasjkvasjkvjksbkjafbskjbfakbsjfbjasbfjasbfkjabsjfkbaksbfjasbfkja" und Sie werden wahrscheinlich einen Seg-Fehler erleiden.

Sie sollten einen Speicherblock haben, der str zugeordnet ist, entweder auf dem Stapel, indem Sie ein Array dafür deklarieren, oder auf dem Heap malloc Speicher für es.

Und Sie sollten nicht den Operator & verwenden.

So würde es so gehen:

#include <stdio.h> 
int main() 
{ 
    char str[50]; // 50 is arbitrary 
    scanf("%s",str); 
    printf("%s",str); 
    return 0; 
} 

oder so:

#include <stdio.h> 
#include <stdlib.h> 
int main() 
{ 
    char* str = malloc(50); // 50 is arbitrary 
    scanf("%s",str); 
    printf("%s",str); 
    free(str); 
    return 0; 
} 
+0

Vielen Dank @YuriLaguardia –

+0

@yano Hoppla! Absolut! – yLaguardia

+0

Entschuldigung @yano. Ich bin neu in StackOverflow, also nicht ganz daran gewöhnt. Ich danke Ihnen für die Freigabe der richtigen Code mit mir :) –