2009-09-01 7 views
2

J'utilise C. J'ai des problèmes avec l'utilisation de pointeurs pour la fonction fscanf. Lorsque je tente de faire:Question concernant les pointeurs dans fscanf

int *x; 
/* ... */ 
fscanf(file, "%d", x[i]); 

Mon compilateur me donne un avertissement disant « argument de format n'est pas un pointeur » et le code juste ne fonctionne pas (je reçois un message disant « Water.exe a cessé de fonctionner »). Si je remplace x par * x, cela ne compile pas ... Est-ce juste un problème de syntaxe?

+0

Je soupçonne qu'il se passe quelque chose d'important dans le "...". Pouvez-vous nous montrer la version complète du plus petit programme que vous pouvez faire pour le faire? C'est copier le programme, dépouiller autant que possible tout en obtenant toujours l'erreur. – dmckee

+0

Aussi dans ce versino s'il vous plaît indiquer ce que vous voulez faire, il y a trop de "ne fonctionne pas" autour. –

+1

Tant '* x' et' x [i] 'sont de type' int', pas de type 'int *' comme attendu par 'fscanf (fichier,"% d "...)'. Alors oui, c'est fondamentalement une erreur de syntaxe. En supposant que vous ayez alloué suffisamment d'espace pointé par 'x', c'est-à-dire, dans ce cas, vous vouliez écrire' fscanf (fichier, "% d", & x [i]) 'ou fscanf (fichier,"% d " x + i) '. – RBerteig

Répondre

11

Si vous voulez lire un seul entier, faites ceci:

int x; 
fscanf(file, "%d", &x); 

Si vous voulez, vous pouvez le faire pour lire un seul entier dans une variable allouée dynamiquement:

int *x = malloc(sizeof(int)); 
fscanf(file, "%d", x); 

Si vous voulez un tableau d'entiers, faites ceci:

int *x = malloc(sizeof(int) * DESIRED_ARRAY_SIZE); 
fscanf(file, "%d", &x[i]); 

%d attend un pointeur vers un int, mais x[i] est un int, vous devez donc prendre l'adresse de votre élément de liste en utilisant l'opérateur address-of (unaire &).

+1

+1 pour inclure un échantillon démontrant l'adresse d'un élément de tableau qui me semble être la source de la confusion du PO. – RBerteig

8

Vous devez allouer de l'espace pour les résultats.

int *x; // declares x 

x = malloc(600000 * sizeof(int)) // and allocates space for it 

for (int i = 0; i < 600000; ++i) { 
    fscanf(file, "%d", &x[i]); // read into ith element of x 
} 
+0

J'ai essayé d'allouer de l'espace en procédant comme suit: x = (int *) calloc (600000, sizeof (int)); Cependant, cela ne fonctionne toujours pas ... – wolfPack88

+2

Ce que vous montrez est la bonne façon de le faire, ce n'est pas mais va illustrer ce que l'OP fait mal: int * x; x = malloc (sizeof (int)); fscanf (fichier, "% d", x); travaillerait. –

+1

Étant donné que l'OP essaie de lire les valeurs dans 'x [i]', je pense qu'il veut un tableau, plutôt qu'un seul 'int'. –

Questions connexes