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> La sortie est la suivante: p> W0e1234567
a0r1e234567
i0n1234567
200112934567
3 Réponses :
Il s'arrête à WhitSpace.
Apparemment, vous avez des pointeurs de 64 bits. Le mot Variable est un pointeur, donc Donc, la première fois de sorte que vous obtenez: p> vous verriez La sortie souhaitée si votre boucle ressemblait à ceci: p> Tailleof (Word) code> est 8. Etant donné que Tailleof code> Un caractère est 1, Tailleof (Word) / Tailleof (Word) ) code> est 8. p> FSCANF code> retourne, il a lu "Nous" dans le tampon. Ensuite, il boucle pour i de 0 à 7. P>
En d'autres termes, FSCANF code> fonctionne comme vous le voulu, le problème est dans le code qui écrit la sortie.
" travaille comme vous avez l'intention i>": 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.
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> Tailleof (mot) code> ne vous donnera pas la taille de la matrice. Il donne la taille du pointeur char * word code>.
We
are
in
2019
Notez que je n'ai pas vérifié la valeur de retour de FSCANF code> pour être eof code> mais le nombre d'éléments qui ont été lus. Dans ce cas où % s code> est utilisé, il est peu probable de faire une différence. Mais là où vous utilisez % d code> c'est certainement, car si des données alphabétiques sont trouvées, il ne peut pas être lu, puis FSCANF code> ne renvoie pas eof code> mais < CODE> 0 CODE> ET BONNE PRATIQUE AVEC LA FACE CODE> SCANF CODE> Fonction Consultez spécifiquement le numéro Nombre d'articles Lire i>.
Plusieurs remarques peuvent être effectuées sur votre code P>
par définition comme dit dans les remarques 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? P> LI>
pourquoi ne pas imprimer directement le mot par (f) met em> ou printf em> avec le format % s em> et obtenez le Longueur de la chaîne en utilisant Strlen em> (si vous voulez le savoir)? P> LI>
ul>
Je veux itérer un certain nombre de fois égal au nombre de caractères numérisés par Scanf. p>
blockQuote>
scannf em> 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 em> si la taille du fichier. P> Tailleof (char) code> est 1, donc votre MALLOC (taille de (caractère) * (46) * peut être simplifié pour être malloc (46) code>. Remarque Vous pouvez également utiliser un tableau Char Word [46]; CODE> P> LI>
fpanf (fp, "% s", mot) code> est très dangereux, si le mot lu plus de 45 caractères, vous écrivez de mot em> avec un mot Comportement non défini, limiter la taille de la taille FSCANF (FP, "% 45s", mot) code> p> li>
Tailleof (Word) / Tailleof (mot [0]) code> Ne retournez pas la longueur de votre mot, vous pouvez simplement arrêter quand mot [i ] code> est 0 p> li>
Tailleof (Word) Code> ne vous donnera pas la taille de la matrice. Cela donne la taille du pointeur. La taille de la matrice est le46 code> que vous avez alloué à l'origine.Char * Word = MALLOC (TAILLEOF (CHAR) * (46)); // Créer un tableau de caractères CODE> - Pourquoi cela peut-il avoir simplement effectuéChar Word [46]; code>?