【问题标题】:C Numbers Guessing GameC数字猜谜游戏
【发布时间】:2014-10-01 17:28:26
【问题描述】:

我刚开始学习 C 编程,为了练习,我找到了这个任务。这是一个数字猜谜游戏,计算机会猜出我心中的数字。首先,我必须想出一个数字。然后我必须在数字所在的范围内进行扫描。然后计算机在该范围内生成一个数字并问我它是否正确。根据计算机的回答,如果太低,我必须回复 L,如果太高,我必须回复 H,如果正确,我必须回复 G。如果它是正确的,它会打印出来以及尝试的次数。如果输入了任何其他字符,则会打印出我输入了错误的答案。

这是我到目前为止所得到的。它没有给我任何错误,但是当我输入 L、H 或 G 时,它会打印出我输入了错误的答案。

提前感谢您的帮助。

#include<stdio.h>
#include<stdlib.h>


void main(){

    int randomNo = 0;
    int input = 0;
    int counter = 0;
    int min = 0;
    int max = 0;
    char answer = ' ';
    char low = 'L';
    char high = 'H';
    char good = 'G';


    printf("Enter min and max: ");
    scanf_s("%d %d", &min, &max);       

    do{     
        randomNo = min + rand() % (max - min) + 1;
        printf("Is it %d?\n", randomNo);
        printf("Enter your answer:");
        scanf_s("%s", &answer);

        if (answer == low){
            printf("Number guessed is low\n");
            min = randomNo;
            counter++;
        }
        else if (answer == high){
            printf("Number guessed is high\n");
            max = randomNo;
            counter++;
        }
        else{
            printf("You entered the wrong answer!\nYour answer should be L - too low H - too high G - goed\n");
        }
    } while (answer != good);

    printf("Your answer is correct!\nYou guessed it in %d times!\n", counter);

}

【问题讨论】:

  • 你的if语句也需要处理answer == good,否则当你输入G时会打印wrong answer。您可以简单地将最后一个else 更改为else if (answer != good)
  • void main() 应该是int main(void)
  • 你使用scanf_s而不是scanf(或fgets/getchar等)的原因是什么?它的便携性较差,并且没有任何优势。如果您必须使用它(因为这是您必须或类似的任务):您使用哪个版本——Microsoft 的 CRT 版本还是 C11 附件 K 中的标准化版本?
  • 我在 Visual Studio 2013 中编写代码,它不允许使用 scanf,因为它不安全。但我会尝试 fgets 和 getchar。

标签: c


【解决方案1】:
scanf_s("%s", &answer);

应该是:

scanf_s("%c", &answer); /* answer is a char (not a string) */

另一方面:

使用相同种子的两个不同初始化将生成 在后续调用 rand 时会产生相同的连续结果。

如果种子设置为 1,则生成器将重新初始化为其初始值 值并产生与调用 rand 或之前相同的值 srand。

为了生成类随机数,通常会初始化 srand 到一些独特的运行时值,比如函数返回的值 时间(在标题中声明)。这对大多数人来说已经足够独特了 微不足道的随机化需求。

在开头添加srand(time(NULL));

【讨论】:

    【解决方案2】:

    而不是

    scanf_s("%s", &answer);
    

    用途:

    scanf_s(" %c", &answer);
    

    因为answer 不是字符串,而是字符。

    您还需要将else 更改为else if(answer != 'G')else if(answer != good)rand 也将生成相同的值。为了生成随机值,您需要

    srand(time(NULL));
    

    main 的开头。这是pseudo-random number generator

    【讨论】:

      【解决方案3】:

      您的 scanf_s 正在“扫描”字符串 (%s),而不是 char (%c)。

      使用scanf_s("%c", &amp;answer) ! :)

      【讨论】:

      • 为什么是scanf_s 而不是scanf
      • @chouaib, scanf_s 具有安全增强功能。
      • 他正在使用 scanf_s,他可能有他的理由(可能是他正在遵循的教程,或者他可能更喜欢一直使用 scanf_s)。我不会要求他改变这一点:O
      • @AlterMann: scanf_s 并不比scanf 更安全(如果使用不当,两者都很危险,如果使用正确,则安全),这里给出的所有答案都很好地说明了原因(所有情况下都是UB) .
      • @Sorikairo:也许 OP 正在使用 MSVC,并被一些标准 C 函数的警告所误导,它鼓励人们编写可移植性较差的代码。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-01
      • 1970-01-01
      相关资源
      最近更新 更多