La lecture de caractère avec scanf()
Ce code est pour jeu de craps.
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <time.h>
int roll_dice(void);
bool play_game(void);
int main()
{
int i, ch,win = 0,lose = 0;
bool flag;
srand((unsigned)time(NULL));
do
{
flag = play_game();
if(flag)
{
printf("You win!");
win++;
}
else
{
printf("You lose!");
lose++;
}
printf("\n\nPlay again(Y/N)? ");
scanf("%c", &ch);
ch = getchar();
printf("\n");
}while(ch == 'Y' || ch == 'y');
printf("\nWins: %d Losses: %d",win,lose);
return 0;
}
int roll_dice(void)
{
return rand()%6 + rand()%6 + 2;
}
bool play_game(void)
{
int sum = roll_dice();
printf("You rolled: %d\n", sum);
if(sum == 7 || sum == 11)
return 1;
else if(sum == 2 || sum == 3 || sum == 12)
return 0;
else
{
int point = sum;
printf("Your point is: %d\n", point);
do
{
sum = roll_dice();
printf("You rolled: %d\n", sum);
if(sum == 7)
return 0;
}while(point != sum);
return 1;
}
}
J'ai un problème uniquement avec de l'extrait de code
printf("\n\nPlay again(Y/N)? ");
scanf("%c", &ch);
ch = getchar();
printf("\n");
J'ai utilisé, car il se termine après une itération quelle que soit la saisie de l'utilisateur Y
ou N
. J'ai pensé que je fais de mal en plaçant ch = getchar()
de manger jusqu'à \n
, je l'ai enlevé et mis un espace avant le spécificateur de conversion et l'a remplacé par " %c"
qui n'a pas de travail.Quand j'ai remplacé les indicateurs de conversion par %d
il fonctionne très bien.
Est quelque chose va mal avec cette?
J'ai visité cette post et il dit la même chose que j'ai fait.
Jeu de le craps?
Jeu de qui trône..
"La lecture de caractère avec
oui, je ne poste pas de question parce qu'il n'a rien à faire avec elle.
BTW, si vous obtenez une valeur dans un personnage (
Jeu de qui trône..
"La lecture de caractère avec
scanf()
" - non, Non, jamais! Pour cela, on peut utiliser fgetc(stdin)
à la place. En fait, si jamais vous envisagez d'utiliser scanf()
, alors ne le faites pas.oui, je ne poste pas de question parce qu'il n'a rien à faire avec elle.
BTW, si vous obtenez une valeur dans un personnage (
%c
), alors il ne devrait pas ajouter un \n
. \n
est un autre personnage par lui-même et que vous êtes aller chercher seul. Mais là encore, mon C++ est plus rouillé que le Titanic.
OriginalL'auteur haccks | 2013-07-05
Vous devez vous connecter pour publier un commentaire.
Posté le code a un comportement indéterminé parce que
ch
est de typeint
et le spécificateur de format%c
doit correspondre à unchar
.Lorsque vous passez à
%d
lascanf()
échoue, carY
ouy
n'est pas unint
, donc pas d'entrée est consommé (à l'exception de grands espaces qui ignore le caractère de nouvelle ligne sur les itérations de la boucle) et de l'ch = getchar()
lit de l'utilisateur a entré des caractères, et le code fonctionne par coup de chance. Toujours vérifier la valeur de retour descanf()
, qui retourne le nombre de missions effectuées.char
peut être définie commeint
, est-ce mal??Et aussi, je suis d'accord que sur l'utilisation de
%d
il ne sera pas lu unchar
etch = getchar()
lit le caractère entré mais, pourquoi il n'est pas de la lecture\n
(derrière à gauche) sur la prochaine itération?mise à jour de réponse.
Pas de. Il ne parvient pas à lire Y. Si getchar lit le Y, laissant de nouveau la ligne de non consommées. La prochaine fois tour de la boucle de la nouvelle ligne est alors ignorée, mais la prochaine Y échoue et getchar le lit, laissant la nouvelle ligne de ...
Vous voulez dire que la ligne est ignoré par l'
scanf
?OriginalL'auteur hmjd
Vous convertir le personnage avec
scanf
(), puis l'écraser avecgetchar
() immédiatement après. Je ne m'attends pas à le faire fonctionner, sauf si vous tapez "yy" avant de taper ENTRER, mais alors votre deuxième confirmation serait un échec.BTW, l'utilisation de l'espace dans
" %c"
.ch -->
char ch;/* " %c" */
Ouais, vous avez raison. J'ai lu @hmjd réponse trop.
OriginalL'auteur Paulo1205
Et c'est la façon dont vous avez perdu la précédente char stockées dans
ch
. Que diriez -à la place?
Mon exemple était en fait erronées et pas ce que je inteneded, voir fixes de mise à jour.
OriginalL'auteur
ce code fonctionne pour moi. Le projet est de K. N. du Roi "programmation en C : Une approche moderne de la" livre. J'ai rencontré ce problème avant et avait le même problème. Sur la page 224, il est une supposition.c exemple de projet qui comprend exactement la même commande "demander" ("play again"). Et l'auteur utilise scanf(" %c", &commande); (il a utilisé la commande au lieu de ch) et il a fait un travail. Je me souviens que je l'ai utilisé pendant le "jeu de craps" projet mais il n'a pas de travail. Probablement que j'ai manqué quelque chose.
Dans l'ensemble, l'expression ci-dessus de 100%.
OriginalL'auteur Orkhan Hasanli