我是c语言的新手,所以如果我犯了一个愚蠢的错误,请原谅。我正在尝试实现一个迷你游戏,你猜测计算机在C中生成的密码。这是我到目前为止提出的代码:
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
int main(void)
{
int c=1;
bool running = 1;
int x = rand() % 20;
printf("The secret number is between 0 and 19, take a guess\n");
int inp = getchar();
while (running) {
if (inp==x) {
printf("Correct. Total number of guesses you spent was %i. Would you like to start a new game? Y/n", c);
bool running=0;
}
else if (inp>x) {
printf("guess smaller\n");
scanf("%i", inp);
}
else if (inp<x) {
printf("guess larger\n");
scanf("%i", inp);
}
c+=1;
}
}
编译完成后,游戏遇到了麻烦:
zhiwei@zhiwei-Lenovo-Rescuer-15ISK:~/workspace$ ./guess
The secret number is between 0 and 19, take a guess
3
guess smaller
2
Segmentation fault (core dumped)
什么是“分段错误”?我该如何解决这个问题?
答案 0 :(得分:3)
由于此行,您有分段错误(核心转储)错误:
scanf("%i", inp);
scanf 方法将指针作为参数。现在程序正在尝试将新值写入内存,而不是为我们的程序保留。
您应该将此行替换为:
scanf("%i", &inp);
答案 1 :(得分:3)
您的代码存在的一个问题是您使用scanf
时使用不当。 scanf
的第一个参数是格式字符串,任何其他参数都应该是指针,因此:
// Incorrect
scanf("%i", inp);
// Correct
scanf("%i", &inp);
当您尝试访问无效的内存地址或您无权访问时,会发生分段错误。假设你运行你的程序,你写的第一个数字是3,所以inp = 3
。到目前为止,一切都运行正常,因为您正在使用getchar
读取第一个数字。但是,您使用scanf("%i", inp)
,scanf
将在地址inp
处写下一个数字,即地址3
,这是您无法写入的地址!因此,您会遇到分段错误。
您的代码中还有另一个错误,但是存在逻辑错误。您使用getchar
读取了第一个数字:如果您想输入大于9的数字,该怎么办?您也应该使用scanf
进行第一次阅读。
...
printf("The secret number is between 0 and 19, take a guess\n");
int inp;
// Not good
inp = getchar();
// Good
scanf("%i", &inp);
...
此外,您的while
循环将永远不会结束,即您的程序将永远运行(除非您将其终止)。确实,每当执行if
块时
if (inp == x) {
printf("Correct. Total number of guesses you spent was %i. Would you like to start a new game? Y/n", c);
bool running = 0;
}
声明一个新变量bool running
,它会覆盖先前声明的running
变量。您应该将其替换为:
if (inp == x) {
printf("Correct. Total number of guesses you spent was %i. Would you like to start a new game? Y/n", c);
running = 0;
}
答案 2 :(得分:1)
除了正确指出分段错误原因的先前答案之外,还有更多问题。以下(我认为)你需要的是:
int main()
{
int c = 1;
bool running = 1;
srand(time(0));
int x = rand() % 20;
printf("The secret number is between 0 and 19, take a guess\n");
int inp;
scanf("%i", &inp);
while (running) {
if (inp == x) {
printf("Correct. Total number of guesses you spent was %i. Would you like to start a new game? Y/N", c);
char a;
scanf(" %c", &a);
if (a == 'N' || a == 'n')
{
running = 0;
}
else
{
c = 0;
srand(time(0));
x = rand() % 20;
printf("The secret number is between 0 and 19, take a guess\n");
scanf("%i", &inp);
}
}
else if (inp>x) {
printf("guess smaller\n");
scanf("%i", &inp);
}
else if (inp<x) {
printf("guess larger\n");
scanf("%i", &inp);
}
c += 1;
}
}
注意事项。你需要在调用rand()之前给出一个种子值,否则你会得到一个相同顺序的数字序列。通常当前时间是一个足够好的种子。其次,您需要阅读问题的答案,用户是否希望继续,并采取相应的行动。在这里,您不能重新定义running(使用bool),否则您将创建一个新变量,而不是替换更高级别变量中的值。另请注意在提示输入char(“c%”)时使用空格。这是避免程序似乎跳过输入所必需的。最后,如果用户选择继续,则需要重置计数器和x。