-1
votes

Combien de caractères est la numérisation FSCANF dans mon code?

J'utilise une boucle pour la boucle, que je veux itérer plusieurs fois égal au nombre de caractères numérisés par Scanf. Cependant, il semble courir trop de fois. Le code a été écrit à l'origine pour imprimer à la phrase "Nous sommes en 2019", ce qu'il fait, mais maintenant je dois l'utiliser pour autre chose. J'ai ajouté dans la ligne: printf ("% i", i);

Pour voir combien de fois, il passait à travers la boucle. Il semble fonctionner 8 fois pour chaque course de la boucle tandis que la longueur de la longueur du mot balayé était. P> xxx pré>

La sortie est la suivante: p>

W0e1234567
a0r1e234567
i0n1234567
200112934567

c

2 commentaires

Tailleof (Word) ne vous donnera pas la taille de la matrice. Cela donne la taille du pointeur. La taille de la matrice est le 46 que vous avez alloué à l'origine.


Char * Word = MALLOC (TAILLEOF (CHAR) * (46)); // Créer un tableau de caractères - Pourquoi cela peut-il avoir simplement effectué Char Word [46]; ?


3 Réponses :


0
votes

Il s'arrête à WhitSpace.

Apparemment, vous avez des pointeurs de 64 bits. Le mot Variable est un pointeur, donc Tailleof (Word) est 8. Etant donné que Tailleof Un caractère est 1, Tailleof (Word) / Tailleof (Word) ) est 8.

Donc, la première fois FSCANF retourne, il a lu "Nous" dans le tampon. Ensuite, il boucle pour i de 0 à 7. xxx

de sorte que vous obtenez: xxx

vous verriez La sortie souhaitée si votre boucle ressemblait à ceci: xxx


3 commentaires

En d'autres termes, FSCANF fonctionne comme vous le voulu, le problème est dans le code qui écrit la sortie.


" travaille comme vous avez l'intention ": Seulement si l'OP avait pour but également de faire un comportement non défini, êtes-vous sûr de cela? ;-)


@bruno, je dis que FSCANF n'est pas la partie qui donne le comportement non défini.



0
votes

Tailleof (mot) code> ne vous donnera pas la taille de la matrice. Il donne la taille du pointeur char * word code>.

Il serait plus simple d'éviter une allocation de mémoire et de la taille de la matrice n'est pas vraiment pertinente de toute façon. P>

We
are
in
2019


1 commentaires

Notez que je n'ai pas vérifié la valeur de retour de FSCANF pour être eof mais le nombre d'éléments qui ont été lus. Dans ce cas où % s est utilisé, il est peu probable de faire une différence. Mais là où vous utilisez % d c'est certainement, car si des données alphabétiques sont trouvées, il ne peut pas être lu, puis FSCANF ne renvoie pas eof mais < CODE> 0 ET BONNE PRATIQUE AVEC LA FACE SCANF Fonction Consultez spécifiquement le numéro Nombre d'articles Lire .



0
votes

Plusieurs remarques peuvent être effectuées sur votre code

  • par définition Tailleof (char) est 1, donc votre MALLOC (taille de (caractère) * (46) * peut être simplifié pour être malloc (46) . Remarque Vous pouvez également utiliser un tableau Char Word [46];

  • fpanf (fp, "% s", mot) est très dangereux, si le mot lu plus de 45 caractères, vous écrivez de mot avec un mot Comportement non défini, limiter la taille de la taille FSCANF (FP, "% 45s", mot)

  • comme dit dans les remarques Tailleof (Word) / Tailleof (mot [0]) Ne retournez pas la longueur de votre mot, vous pouvez simplement arrêter quand mot [i ] est 0

  • Pour imprimer l'index juste après que chaque personnage ne produit pas de résultat très lisible, êtes-vous sûr de le vouloir?

  • pourquoi ne pas imprimer directement le mot par (f) met ou printf avec le format % s et obtenez le Longueur de la chaîne en utilisant Strlen (si vous voulez le savoir)?

    Je veux itérer un certain nombre de fois égal au nombre de caractères numérisés par Scanf.

    scannf analyse plus que le nombre de caractères dans les retours de la chaîne, les espaces sont contournés en silence. Une seule chose est sûre, lorsque vous atteignez la fin du fichier sans erreur, le nombre de caractères numérisés par scanf si la taille du fichier.


0 commentaires