2015-10-10 208 views
-1

我正在编写一个程序,其目标是生成一个随机的三位数字,并让用户对其进行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声明的中间,我也将这些代码移动到一个单独的函数中,这样用户就可以再次播放而不必关闭程序并重新打开它)。

回答

2

因为您正在传递一个整数到scanf()其中需要指针。

使从一个整数指针不确定的行为,你应该通过价值也的地址,因为它们会被函数体改,在这种情况下使用scanf()正确的做法是

if scanf("%d%d%d*%c", &userDig1, &userDig2, &userDig3) == 3) 
    input_is_correct(); 
else 
    input_is_bad(); 

公告在你的情况下,你通过0scanf(),它会尝试取消引用(void *) 0x00NULL也许。这也是未定义的行为。

使用指针不与&操作者或malloc()/calloc()/realloc()返回值所取的变量的地址是在一般未定义的行为。

+0

哇,我意识到我发布后做了什么。出于某种原因,我的眼睛在我的编辑器中看不到它......至少我发现了这个问题。感谢您的答复! – louiedro

相关问题