Je traverse des leçons au livre S.Prata: 'C Primer Plus'. Chapitre 6, question de contrôle n ° 8: La chose est ... aussi loin que je connais Je pensais qu'il s'agira de "g" ... mais il imprime en fait 'Go West, Youn'. Pourquoi? Ce n'est pas Je suppose qu'il pourrait être parce que % c code> dans
scanf code> devrait être Utilisé pour un seul caractère, pas pour une phrase comme 'aller ouest, jeune homme! ". Pourquoi ce programme lit toutes les lignes et stocke tout cela (à l'exception du dernier mot), pas seulement un premier caractère? Cela stocke-t-il automatiquement des trucs dans
scanf code> comme une matrice? P>
% s code>, mais
% c code>. P>
% c code> stocke toutes les entrées à " Char '.. Mais dans les spécifications, il a dit que cela stocke uniquement un seul caractère, pas plusieurs. P> P>
3 Réponses :
Le programme lit simplement tous les caractères un par un em> de l'entrée. donc pour une entrée telle que p> puis le premier Appelez à Notez également que Scanf code> lit le caractère unique
'g' code>. Ensuite, dans la boucle, vous imprimez ce seul
'g' code>, suivi de la lecture du caractère unique
'o' code>. Ensuite, dans la prochaine itération de la boucle, vous imprimez le caractère unique
'o' code> (que vous avez lu dans l'itération précédente), puis lisez l'espace
'' code>. Et ainsi de suite. P>
'g' code> n'est pas égal à
'g' code>. La comparaison de caractère est sensible à la casse. P> p>
Oui, c'est compréhensible. La question était - pourquoi scanf () stocke pour tamponner une phrase totale 'aller ouest, jeune homme!', pas seulement 'g'. Comme il s'agit de SCANF ("% C", et CH), pas un scanf ("% s", & ch);
@igroglaz et je vous ai dit: cela ne lit pas la "phrase entière", il a lu un personnage à la fois.
La question concerne stocker une longue phrase dans% c tampon (point de caractère unique), pas sur la lecture de tampon
@igroglaz, mais comme je l'ai dit dans un autre commentaire, votre programme ne stocke pas de "longue phrase" nulle part, tout ce que vous stockez est un personnage unique i> dans la variable ch code>. Et puisque vous avez une boucle qui court et encore et encore, vous allez lire un seul personnage encore et encore et encore.
Oui, je l'ai compris depuis le début :) Il y avait un problème avec mon étant entendus en suivant que C Tampon stocke des trucs et comment Scanf le prend de là 8)
Il y a une boucle, qui a le donc, il continue à lire les entrées présentes dans le tampon jusqu'à ce que trouve un donc, pour l'entrée p> Ça continuera à lire les caractères un par Un, dans chaque itération jusqu'à ce qu'elle lit le scanf () code> dans son corps
'g' code>. p>
'g' code> et rencontre les critères de sortie de la boucle. p> p>
Oui, c'est compréhensible. La question était - pourquoi scanf () stocke pour tamponner une phrase totale 'aller ouest, jeune homme!', pas seulement 'g'. Comme il s'agit de SCANF ("% C", et CH), pas un scanf ("% s", & ch);
@igroglaz donné ch code> est un
char code>,
scanf ("% s", & ch); code> est faux. Cela dit, avec
% s code>, l'entrée est assortie et stockée en une fois, il n'y a pas de boucle nécessaire. Cependant, dans ce cas, à cause de la boucle, il continue à lire du tampon d'entrée l'une après l'autre.
En d'autres termes, chaque appel à SCANF ("% C", & CH); code> lit, correspond à AD stocke un caractère à la fois. Combiné que avec la boucle, il lit plusieurs ..
@igroglaz Remplacez le moment avec si vous obtiendrez votre sortie attendue .Sait lorsque vous vérifiez «G» dans la chaîne et exécutez jusqu'à «G».
Les gars, merci, mais je n'ai toujours pas eu de réponse. Je suppose que c'est mon mauvais anglais, alors il est difficile de me comprendre. Encore une fois: j'ai lu dans le livre que% C - est pour un seul caractère. Ainsi, lorsque ce programme a scanf ("% c", & ch); (Au début! String n ° 4) - Il ne devrait stocker que le 1er symbole de la phrase, car c'est% c, pas% s, n'est-ce pas? Pourquoi 'Scanf ("% C", & CH)' à la chaîne n ° 4 stocke cette longue phrase, au lieu de stocker simplement 'g'? Une autre partie du programme est très simple et contraire. La question concerne réellement le stockage initial de cette phrase, qui devient stocker sur une «chaîne», tandis que Scanf a obtenu un% C
@igroglaz Vous lisez un personnage et vous imprimez un personnage, 14 fois. Essayez de remplacer votre printf () code> par
printf ("Lire le caractère: '% c' \ n", ch); code>, il est peut-être plus clair que ce qui se passe.
@igroglaz Avez-vous remarqué l'autre appel à scanf code> à l'intérieur i> la boucle?
Le caractère maintenant, voyons pourquoi la boucle entre plusieurs fois. P> Vous avez entré de nombreux caractères dans le scanaf à l'extérieur de la boucle, Ensuite, dans la boucle, vous vous attendez à imprimer le premier caractère, ce qui est totalement correct. Mais, vous pensez que cela attendra la saisie de l'utilisateur, qui est résumer, je soupçonne que votre problème est que vous mal comprenez comment fonctionne Scanf. Vous pensez que cela attendra toujours la saisie de l'utilisateur chaque fois que vous avez appelé. Ce n'est pas le cas, il peut être lu à partir de l'entrée précédente. P> si vous souhaitez que le prochain ch code> ne stockera jamais de chaîne entière, il stocke uniquement un caractère. La sortie que vous obtenez est
PrintF code> EXECUTION, il est par plusieurs exécutions de
printf code> S (la boucle entre plusieurs fois) . Vous pouvez confirmer que, en modifiant le code sur:
scanf code>, lorsque vous avez entré plusieurs caractères, il suffit de lire le premier. Mais il y a quelque peu un curseur caché dans la STDIN (entrée standard) qui tient une trace de ce qui a été lu. Lorsque vous êtes entré "Go Ouest, jeune homme!", Le
g code> est stocké dans CH et le curseur est mis avant le
O code>. Lorsque vous appelez le prochain appel
scanf code>, il examinera la position du curseur et trouve un
o code>, de sorte que cela n'attendra pas la saisie de l'utilisateur et le lit simplement. etc. p>
scanf code> s pour ignorer la première entrée longue, vous devriez réellement le lire (ou chercher le stdin qui fonctionnera dans Windows mais non Linux). Exemple: p>
Cher Youssef13! Merci beaucoup pour une excellente explication!
J'ai écrit un article, où j'ai inclus votre explication:
Je vous recommande de savoir comment utiliser un débogueur i>. Avec cela, vous pouvez parcourir le code, l'instruction par déclaration, tout en surveillant les variables et leurs valeurs. Si vous faites cela, vous pouvez voir exactement ce qui se passe. Savoir utiliser un débogueur est également nécessaire pour résoudre des problèmes complexes et vraiment quelque chose que vous devez savoir si vous êtes n'importe où près de sérieux sur la programmation.
Oui, j'utilise du débogueur, merci. La question était de stocker une longue phrase dans% c tampon (point de caractère unique), pas sur la lecture de tampon
Si vous parcourez le code dans un débogueur, vous verrez que vous ne stockez aucune "phrase longue" nulle part, que seuls les personnages simples un par un.
Je suppose que ce livre a un chapitre sur les constructions en boucle, en utilisant
pour code>,
pendant code> et
do ... tandis que code>. Il semble que vous n'ayez pas encore saisi le concept de boucle, je vous recommande donc de lire à nouveau le chapitre.
Parce que
g code> et
g code> sont des caractères différents. L'une est majuscule et l'une est minuscule.
@SomeProGrammerDude Je suppose que j'ai mélangé le terme «débogueur» et fonction que j'utilise. J'ai "Borland C ++ Builder 6" et il y a une fonction "hors-pied" qui effectue un programme par étapes (1 chaîne à la fois). Est-ce que cela s'appelle débogueur ou c'est autre chose?
@Ianabbott j'ai saisi ça .. Mais je n'ai pas saisi comment Scanf travaille :) Merci à Youssef13 maintenant je suis désactivé ça =)