2017-03-04 1 views
0

Je crois comprendre que fgets() retourne le paramètre de chaîne qui est entrée, cependant,de la valeur de retour de fgets()

Je reçois « erreur: types incompatibles lors de l'attribution de type « char [101 ] 'from type' char * '",

Alors, pourquoi la variable' line 'est-elle considérée comme type' char [101] 'et non' char * '?

char line[101] = ""; 

while (feof(filePtr) == 0){ 
    line = fgets(line, 101, filePtr); 
    strcpy(strPtr, line); 
} 
+0

parce que c'est la façon dont il est défini ... – StoryTeller

+4

[Utilisation 'feof()' comme condition de la boucle est mauvaise.] (Http://stackoverflow.com/questions/5431941/why-is-while-feof- file-always-wrong) – MikeCAT

Répondre

4

Il y a deux points à clarifier ici:

  • Vous ne avez pas besoin d'obtenir le résultat de fgets() appel dans le pointeur de tableau. Le premier paramètre de fgets() est le tableau à utiliser pour stocker les valeurs lues. Vous pouvez créer n'importe quel pointeur char temporaire et obtenir le résultat de fgets() dedans. Ce pointeur ne sera utilisé pour détecter les erreurs fgets() si sa valeur est nulle.

  • Le nom de tableau dans c ne peut recevoir aucune valeur. Comme il est parfois traité comme un pointeur vers le premier élément du tableau, il peut être mal compris. De même que le compilateur connaît la taille du tableau au moment de la compilation, il utilise cette information. Si vous avez utilisé sizeof(line) la sortie sera 101 au lieu de 4 ce qui devrait être le cas de sizeof(any pointer) dans une machine 32 bits ou 8 dans des machines 64 bits.

+2

C'est compliqué, mais un nom de tableau n'est pas un pointeur; c'est le nom d'un tableau. Dans de nombreux contextes, il se transforme en un pointeur vers le premier élément du tableau, mais pas tous ('sizeof' est le plus connu,' _Alignof' est moins connu). Un nom de tableau (distinct d'un paramètre de fonction de type tableau) n'est pas un lvalue modifiable; vous ne pouvez pas l'assigner. Mais strictement ce n'est pas parce que c'est un pointeur constant, bien qu'il soit modérément similaire. –

+0

@Jonathan Leffler J'ai modifié ma réponse en fonction de votre commentaire. –

5

Longue histoire courte: Vous ne pouvez pas attribuer à un tableau, ce n'est pas une lvalue modifiable. Vous devez définir un autre pointeur pour contenir la valeur de retour.

why is the variable line considered type char[101] and not type char *

Dans votre cas, line n'est pas considéré être de type char [101], il est en effet. In some of the cases, le tableau se désintègre en un pointeur vers le premier élément du tableau, mais cela ne change rien au fait que la variable de tableau elle-même est de type tableau.

Cela dit, vous en abusez. Vous n'avez pas besoin pour stocker la valeur de retour là. Vous pouvez juste le vérifier contre NULL et se faire avec. fgets() stocke de toute façon la valeur analysée dans le tableau line. C'est tout le point de passer line (et sa taille) en premier lieu.

Cela dit, s'il vous plaît voir Why is “while (!feof (file))” always wrong?