我正在编写一个程序,其目标是生成一个随机的三位数字,并让用户对其进行10次猜测。如果他们在正确的位置猜测一个正确的数字,它就被认为是“命中”。如果他们猜测一个正确的数字,但它在错误的位置,它被认为是“匹配”。例如,如果要猜测的数字是123,并且输入329,则2将是命中,3将是匹配。到目前为止我的代码如下所示:这段代码为什么会产生分段错误?
#include <stdio.h>
#include <time.h>
#define MIN 100
#define MAX 999
int main()
{
//Declare variables
int userDig1 = 0, userDig2 = 0, userDig3 = 0, randDig1 = 0, randDig2 = 0, randDig3 = 0, guesses = 0;
//Generate random three digit number
srand(time(NULL)); //seed
randDig1 = rand() % ((MAX + 1) - MIN) + MIN; //corresponds to the first digit
randDig2 = rand() % ((MAX + 1) - MIN) + MIN; //corresponds to the second digit
randDig3 = rand() % ((MAX+ 1) - MIN) + MIN; //corresponds to the third digit
//A for loop that keeps track of the number of guesses
for (guesses = 1 ; guesses <= 10 ; guesses++)
{
//Store user's guess into the appropriate variables
printf("Enter guess number %d:\n", guesses);
scanf("%d%d%d\n", userDig1, userDig2, userDig3);
//Check the user's digits against the actual digits
if (userDig1 == randDig1) //if first user digit = first actual digit
{
printf("Number %d is a hit!\n", userDig1);
}
if (userDig2 == randDig2) //if second user digit = second actual digit
{
printf("Number %d is a hit!\n", userDig2);
}
if (userDig3 == randDig3) //if third user digit = third actual digit
{
printf("Number %d is a hit!\n", userDig3);
}
if (userDig1 == randDig1 && userDig2 == randDig2 && userDig3 == randDig3) //if all 3 user digits = all 3 actual digits
{
printf("Congratulations, you guessed the number %d%d%d\n", userDig1, userDig2, userDig3);
break;
}
if (userDig1 == randDig2 || userDig1 == randDig3) //if first user digit = second or third actual digit
{
printf("Number %d is a match!\n", userDig1);
}
if (userDig2 == randDig1 || userDig2 == randDig3) //if second user digit = first or third actual digit
{
printf("Number %d is a match!\n", userDig2);
}
if (userDig3 == randDig1 || userDig3 == randDig2) //if third user digit = first or second actual digit
{
printf("Number %d is a match!\n", userDig3);
}
else //if none of the user's digits are matches or hits
{
printf("None of the digits you entered are matches or hits. Guess again.\n");
}
}
printf("Game over! You failed to guess the correct number.\n");
}
编译和运行之后,我得到一个分段错误后,我在我的第一个猜测进入。
现在我知道为什么发生分段错误。这意味着你正试图访问你无法访问的内存/值(沿着这些行)。但在这种特殊情况下,我不明白会发生什么情况。如果我不得不冒险猜测,我会说这与我的scanf
声明有关,我试图通过将每个数字解释为单独的整数来“提取”数字。我知道提取数字的数学方法(mod除以10,除以10),因为我在不同的程序中使用了这个概念,但是没有使用循环逻辑。我试图在这里使用循环来提取数字,但我还没有找到适用于所有数字的方法。所以最终,我的问题在这里,我能做些什么来解决它?
任何和所有的帮助表示赞赏。 (此外,我知道我在这里有一些不好的格式,例如break
声明在所有if
声明的中间,我也将这些代码移动到一个单独的函数中,这样用户就可以再次播放而不必关闭程序并重新打开它)。
哇,我意识到我发布后做了什么。出于某种原因,我的眼睛在我的编辑器中看不到它......至少我发现了这个问题。感谢您的答复! – louiedro