gpt4 book ai didi

C: rand() 和 scanf() 故障?

转载 作者:行者123 更新时间:2023-11-30 19:52:45 25 4
gpt4 key购买 nike

我对 C/C++ 有点陌生,我不明白以下代码中的问题是什么。在此作业中,我只能使用 C 函数和语法,不允许使用 C++。

程序应该从字母表中随机选择一个字符,并让用户尝试猜测 3 次。

#include <stdio.h>
#include <stdlib.h>
#define guesses 3

int main(){

setbuf(stdout, NULL);
/* A 2.P.b */

/* version with loop*/

int i = 0;
char randomChar = (65 + (rand()%26) + 1);

/* comment the line below, when the programm works as intended */
printf("\n%c\n", randomChar);

char guessedChar;

while((i<=guesses) && (guessedChar != randomChar)){

printf("Guess a letter.\n");
scanf("%c", &guessedChar);

if(guessedChar != randomChar){
int guessesLeft = guesses - i;
if (guessesLeft > 1){
printf("Wrong letter. You have %d more tries.\n", guessesLeft);
}
else{
printf("Wrong letter. Last try.");
}

}

else{
printf("Congratulations.\n");
}

i++;
}
return 1;
}

输出如下:

Q
Guess a letter.
A
Wrong letter. You have 3 more tries.
Guess a letter.
Wrong letter. You have 2 more tries.
Guess a letter.
B
Wrong letter. Last try.Guess a letter.
Wrong letter. Last try.

问题:

选择的字母不是随机的,但总是 Q。

第一个猜测需要付出两条“生命”?!

最佳答案

scanf 的问题是您输入的字母后面的换行符仍然保留在输入缓冲区中,并将在下次读取。

要解决这个问题,只需告诉 scanf通过在格式字符串中添加单个空格来读取并跳过所有前导空格,例如

scanf(" %c", &guessedChar);
// ^
// |
// Note space here
<小时/>

随机数生成的问题是您没有为生成器提供种子,这意味着它将始终以相同的种子开始并始终生成相同的数字。

要设置种子,您需要调用 srand调用 rand 之前的函数,这是一个不可预测的种子(当前时间通常就足够了):

srand(time(NULL));
<小时/>

然而,还有一个更严重的问题,那就是您在初始化之前使用了 guessedChar。这将导致 undefined behavior因为未初始化的非静态局部变量具有不确定的值。在使用本地(非静态)变量之前必须初始化它们,并且未初始化变量的唯一有效用途就是对其进行初始化。

关于C: rand() 和 scanf() 故障?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26630907/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com