[英]Reading character with scanf()
此代码适用于掷骰子游戏 。
#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;
}
}
我只有代码片段有问题
printf("\n\nPlay again(Y/N)? ");
scanf("%c", &ch);
ch = getchar();
printf("\n");
我已经使用过,因为无论用户输入Y
还是N
,它都会在一次迭代后终止。 我认为我做错了是把ch = getchar()
吃掉了\\n
,我删除它并在转换说明符之前放置一个空格并用" %c"
替换它也没用。当我替换转换说明符时%d
它工作正常。
这有什么问题吗?
我访问了这个帖子 ,它说的是同样的事情。
发布的代码具有未定义的行为,因为ch
的类型为int
,格式说明符%c
必须与char
匹配。
当我替换转换说明符%d时,它工作正常。
切换到%d
, scanf()
失败,因为Y
或y
不是int
,因此不会消耗任何输入(除了在循环的后续迭代中丢弃新行字符的前导空格)和随后的ch = getchar()
实际读取用户输入的字符,代码由fluke工作。 始终检查scanf()
的返回值,该值返回所作的分配数。
scanf("%c", &ch);
ch = getchar();
这就是你丢失以前存储在ch
char的方式。 怎么样
ch = fgetc(stdin);
while (fgetc(stdin) != '\n')
;
代替?
您使用scanf
()转换字符,然后立即用getchar
()覆盖它。 我不希望它工作,除非你在输入ENTER之前键入“yy”,但那么你的第二次确认将失败。
顺便说一句,使用" %c"
的空格。
printf("Play again? ");
scanf(" %c", &char);
这段代码适合我。 该项目来自KNKing的“C编程:现代方法”一书。 我之前遇到过这个问题并遇到了同样的问题。 在页224上有一个guess.c示例项目,其中包含完全相同的命令“ask”(“再次播放”)。 作者使用了scanf(“%c”,&command); (他使用命令而不是ch)它确实有效。 我记得我在“掷骰子游戏”项目中使用它但它没有用。 可能我错过了一些东西。 总的来说,100%以上的表达确实有效。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.