-1
votes

Saisie d'une phrase pour scanner ("% c", & ch) ... (% c pour la séquence, pas pour le symbole unique)

Je traverse des leçons au livre S.Prata: 'C Primer Plus'. Chapitre 6, question de contrôle n ° 8: xxx

La chose est ... aussi loin que je connais % c dans scanf 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 comme une matrice?

Je pensais qu'il s'agira de "g" ... mais il imprime en fait 'Go West, Youn'. Pourquoi? Ce n'est pas % s , mais % c .

Je suppose qu'il pourrait être parce que % c stocke toutes les entrées à " Char '.. Mais dans les spécifications, il a dit que cela stocke uniquement un seul caractère, pas plusieurs.


7 commentaires

Je vous recommande de savoir comment utiliser un débogueur . 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 , pendant et do ... tandis que . 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 et g 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 =)


3 Réponses :


1
votes

Le programme lit simplement tous les caractères un par un de l'entrée.

donc pour une entrée telle que xxx

puis le premier Appelez à Scanf lit le caractère unique 'g' . Ensuite, dans la boucle, vous imprimez ce seul 'g' , suivi de la lecture du caractère unique 'o' . Ensuite, dans la prochaine itération de la boucle, vous imprimez le caractère unique 'o' (que vous avez lu dans l'itération précédente), puis lisez l'espace '' . Et ainsi de suite.

Notez également que 'g' n'est pas égal à 'g' . La comparaison de caractère est sensible à la casse.


5 commentaires

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 dans la variable ch . 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)



4
votes

Il y a une boucle, qui a le scanf () dans son corps xxx

donc, il continue à lire les entrées présentes dans le tampon jusqu'à ce que trouve un 'g' .

donc, pour l'entrée xxx

Ça continuera à lire les caractères un par Un, dans chaque itération jusqu'à ce qu'elle lit le 'g' et rencontre les critères de sortie de la boucle.


7 commentaires

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 est un char , scanf ("% s", & ch); est faux. Cela dit, avec % s , 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); 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 () par printf ("Lire le caractère: '% c' \ n", ch); , il est peut-être plus clair que ce qui se passe.


@igroglaz Avez-vous remarqué l'autre appel à scanf à l'intérieur la boucle?



1
votes

Le caractère ch ne stockera jamais de chaîne entière, il stocke uniquement un caractère. La sortie que vous obtenez est non donnée par un seul PrintF EXECUTION, il est par plusieurs exécutions de printf S (la boucle entre plusieurs fois) . Vous pouvez confirmer que, en modifiant le code sur: xxx

maintenant, voyons pourquoi la boucle entre plusieurs fois.

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 pas correct. Dans le premier scanf , 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 est stocké dans CH et le curseur est mis avant le O . Lorsque vous appelez le prochain appel scanf , il examinera la position du curseur et trouve un o , de sorte que cela n'attendra pas la saisie de l'utilisateur et le lit simplement. etc.

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.

si vous souhaitez que le prochain scanf 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: xxx


2 commentaires

Cher Youssef13! Merci beaucoup pour une excellente explication!


J'ai écrit un article, où j'ai inclus votre explication: skobki.com/... :)