首先我是C的新手。我正在尝试编写一个猜谜游戏。这很简单,您只是在猜测,直到找到程序在“no_to_guess”变量中保存的数字。问题是,如果我将变量转换为 char 类型,程序会打印两次“猜数字”提示,但是当我将其改回 int 类型时,它一切正常。你们有什么想法吗?
int main(){
int no_to_guess = 5,guess;
while(guess != no_to_guess){
printf("Guess a number: ");
scanf("%d",&guess);
if(guess == no_to_guess) printf("You Won");
}
return 0;
}
int 类型没有问题,但是当我将变量更改为 char 类型时,程序提示用户两次猜测。我知道使用 char 类型没有意义,但我只是想知道为什么会这样。
char no_to_guess = '5',guess;
while(guess != no_to_guess){
printf("Guess a number: ");
scanf("%c",&guess);
if(guess == no_to_guess) printf("You Won");
}
对于char类型提示: Guess the number: Guess the number: 对于 int 类型,它应该是:猜数字:
你需要初始化猜测,或者只有在你阅读了一些输入之后才检查它。
格式字符串
"%c"
不忽略空格,不像 "%d"
,所以你想使用格式字符串 " %c"
来实现类似的行为。
特别检查 I/O 操作的返回值总是一个好主意。如果
scanf()
失败,您将默默地操作未初始化的数据。
我将
guess != no_to_guess
和 guess == no_to_guess
重构为一个测试(如果您愿意,您也可以在 break
之前打印“你赢了”)。
顺便说一句,在即将到来的 C 2023 中(或者如果您的编译器支持扩展),您可以通过执行
char guess;
.来减少重复并确保相同的类型,而不是
typeof(no_to_guess) guess;
#include <stdio.h>
int main(void) {
char no_to_guess = '5';
for(;;) {
printf("Guess a number: ");
char guess;
if(scanf(" %c", &guess) == 1) {
printf("scanf failed\n");
return 1;
}
if(guess == no_to_guess)
break;
}
printf("You Won\n");
}
示例会话:
Guess a number: 1
Guess a number: 2
Guess a number: 5
You Won