2016-07-29 3 views
1

Ich bin verwirrt über die Argumente in sscanf RoutineWarum sscanf Bedarf & für% d ganze Zahlen sind aber nicht für% s Saiten

#include <string.h> 
char sentence[20]; 
char first_name[7]; 
char last_name[7]; 
int age; 

strcpy(sentence, "aaaaaa bbbbbb 20"); 
sscanf(sentence, "%s %s %d", first_name, last_name, &age); 

Warum ist das char-Arrays müssen nicht & Präfix aber Integer-Variable tut?

Danke

+3

Da Array-Name ist ein Verweis auf Basisadresse – sinsuren

+0

Array verfällt zu Zeiger, so hat es bereits die Adresse der Zeichenfolge –

+0

mit einer dynamischen Zuordnung, könnte Ihre Variable Satz geschrieben werden wie 'char * sentence = malloc (sizeof (char) * 20); Vielleicht hilft es Ihnen zu verstehen –

Antwort

3

Eine Zeichenfolge in C eine Folge von Zeichen durch ein ‚\ 0‘ gefolgt ist. Der Name eines Arrays in C ist die Adresse des initialen Elements. Für eine einzelne Ganzzahl müssen Sie also die '&' hinzufügen, um die Adresse zu übergeben, an der Sie den int speichern möchten.

0

In C steht der Name des Arrays für die Basisadresse.
In sscanf() müssen Sie den Speicherort übergeben, wo Variablenwert gespeichert werden konnte. So & bedeutet address of, wird verwendet, um die Adresse im Falle von primitiven Typen zu erhalten. Deshalb wird & mit dem Datentyp int verwendet. Aber String ist das Array (gefolgt von '\0') von Zeichen, Name bietet die Basisadresse.

+2

Sie sind alle Zeiger, aber nicht auf den gleichen Datentyp: 'arr' ist ein Zeiger auf ein Array von x Elementen eines bestimmten Typs,' & arr' ist ein Zeiger, zu einem Zeiger auf ein Array von x Elementen eines gegebenen Typs und '& arr [0]' ist ein Zeiger auf ein Element des Array-Elementtyps. – naccyde

-1

In C ist der Bezeichner des Array eines Zeichens als Zeiger auf das erste Element des Arrays verfallen.

sscanf() Funktion einen Zeiger auf einen Speicherplatz muss in sich schreiben, wenn Sie einen int Typen passieren, sollten Sie die Variablennamen mit & Präfix, das für die Wirkung hat die Adresse der Variablen zu übergeben. Auf diese Weise kann sscanf direkt auf den Speicherort der Variablen schreiben. Sie übergeben ein Argument als Referenz, nicht als Kopie.

Da der Array-Name zu einem Zeiger auf das erste Element des Arrays verfallen ist, müssen Sie ihn nicht mit & voranstellen, da sscanf bereits auf den Speicherort zugreifen.

+2

Nein, der Typ ist falsch, Array-Name wird zum Zeiger auf * das erste Element des Arrays *, nicht das ganze Array (es hat natürlich den gleichen Rohwert). – hyde

+0

@hyde: Du hast Recht, die Post ist korrigiert. Ich verwechselte mit '& Satz', die einen Zeiger auf das Array zurückgeben, nicht das erste Element. – naccyde

0

& in der aufgerufenen Funktion impliziert Adresse.

sscanf erwartet die Adresse der Variablen, so dass sie die gelesenen Werte aus der angegebenen Zeichenfolge in diese Adressen (und damit in diese Variablen) speichern kann.

Ein Array-Name in C bezieht sich auf die Adresse des ersten Array-Elements, aber für eine Variable müssen Sie die Adresse der Variablen angeben.

Verwandte Themen