2016-06-20 12 views
1

Ich möchte eine Zeichenfolge scannen und einen char Zeiger auf diese gescannte Zeichenfolge zeigen.scanf eine Zeichenfolge in einem Zeichenzeiger

int main(int argc, char *argv[]) { 

    char *string; 
    scanf("%s",&string); 
    printf("%s\n",string); 

} 

Aber gibt eine Warnung

Warnung sagen: Format '% s' erwartet Argument vom Typ 'char *', aber Argument 2 hat 'char **'

Typ

Wie scanne ich eine Zeichenfolge in einem char * ohne Warnungen.

Edit: Es funktionierte für den untenstehenden Code mit Warnungen und ich drillte es auf den oben genannten, um sehr spezifisch zu sein.

int main(int argc, char *argv[]) { 

    int n = 2; 

    char *strings[2]; 
    for(int i = 0; i < n; i++){ 
     scanf("%s",&strings[i]); 
     printf("%s\n",&strings[i]); 
    } 

} 

enter image description here

+1

Speicher zuerst für String-Variable zuweisen, dann nur "String" statt "& String" übergeben. – Jeyaram

+0

Mit anderen Worten, Sie fragen, wie Sie den Compiler-Fehler verschwinden lassen, wenn Sie noch nicht herausgefunden haben, wie Sie einen Speicherpuffer zuweisen. –

+0

... oder verwenden Sie eine Zeichenfolge fester Länge. Es hängt davon ab, was Sie beim Lesen vorhaben. – Kusalananda

Antwort

5

Zu allererst in %sscanf() erwartet einen Zeiger auf char, kein Zeiger auf char zu-Zeiger.

Zitiert C11, Kapitel §7.21.6.2/p12, fscanf() (Hervorhebung von mir)

s
Findet eine Folge von nicht-white-space Zeichen. 286)

Wenn kein l Längenmodifizierer vorhanden ist, wird das entsprechende Argument sein, ein Zeiger auf das Anfangselement eines Zeichenfeldes groß genug, um die Sequenz und ein abschließendes Nullzeichen zu akzeptieren, die hinzugefügt werden automatisch. [...]

ändern

scanf("%s",&string); 

zu

scanf("%s",string); 

Das heißt, müssen Sie Speicher string zuweisen, bevor Sie tatsächlich zu Scan in es versuchen. Andernfalls werden Sie den nicht initialisierten Zeiger verwenden, der undefined behavior aufruft.