在C中做一个猜谜游戏,但当我改变变量类型时输出不同[重复]

cgfeq70w  于 2023-05-06  发布在  其他
关注(0)|答案(1)|浏览(146)

此问题已在此处有答案

scanf() leaves the newline character in the buffer(7个回答)
7天前关闭
首先,我是C的新手。我在写一个猜谜游戏。这很简单,你只是猜测,直到你找到程序在“no_to_guess”变量中保存的数字。问题是,如果我把变量的类型,字符程序打印“猜测数字”提示两次,但当我改变它回到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类型,它提示:猜数字:猜数字:对于int类型,它的工作原理是:猜数字:

x6yk4ghg

x6yk4ghg1#

1.你需要初始化guess,或者只在你读了一些输入后检查它。
1.与"%d"不同,格式字符串"%c"不会忽略空白,因此您希望使用格式字符串" %c"来实现类似的行为。
1.特别检查I/O操作的返回值总是一个好主意。如果scanf()失败,您将在未初始化的数据上进行静默操作。
1.我将guess != no_to_guessguess == no_to_guess重构为一个测试(如果您愿意,也可以在break之前打印“You Won”)。
1.顺便说一句,在即将到来的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

相关问题