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

问题描述 投票:0回答:1

首先我是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 integer char output
1个回答
1
投票
  1. 你需要初始化猜测,或者只有在你阅读了一些输入之后才检查它。

  2. 格式字符串

    "%c"
    不忽略空格,不像
    "%d"
    ,所以你想使用格式字符串
    " %c"
    来实现类似的行为。

  3. 特别检查 I/O 操作的返回值总是一个好主意。如果

    scanf()
    失败,您将默默地操作未初始化的数据。

  4. 我将

    guess != no_to_guess
    guess == no_to_guess
    重构为一个测试(如果您愿意,您也可以在
    break
    之前打印“你赢了”)。

  5. 顺便说一句,在即将到来的 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
© www.soinside.com 2019 - 2024. All rights reserved.