scanf 与类型错误混淆

scanf confusion with type error

我只是编写了一个程序来猜测数组中的一些随机对,如果猜对了,删除这对。

我遇到一个问题,我只能输入整数 number.Everytime 我试着输入 * ,程序会崩溃。我使用这样的条件:

if (scanf("%d",&temp)==1)

试图解决我的问题,但它确实不起作用。

这是我的代码,请给我一些帮助:

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

int main() 
{
    int r[4]; //random
    int s[8]; //store
    char c[8]; //cover
    int g[8]; //guess
    int i;
    int round=0;
    int left = 4;
    int point = 0;
    int clear_index[2];
    int temp;

// generate random number
for (i=0;i<4;i++)
{
    r[i] = (rand()%10)+1;
    s[i] = r[i];
    s[i+4] = r[i];
}
// show the default number
printf("[show]    ");
for (i=0;i<8;i++)
{
    printf("%d ",s[i]);
    c[i] = '*';
}
printf("\n");

while(left>0)
{
    // print left
    printf("[cover]   ");
    for (i=0;i<8;i++)
        printf("%c ",c[i]);
    printf("\n");
    //guess 
    printf("[guess]   ");
    for(i=0;i<8;i++)
    {
        if (scanf("%d",&temp)==1)
            g[i] = temp;        

        if (g[i] == s[i])
        {
            printf("v\n");
            clear_index[point] = i;
            point++;
        }
    }
    if (point == 2)
    {
        for (i=0;i<2;i++)
            c[clear_index[i]]=' ';
        left-=1;
        point = 0;          
    }
    round+=1;
    //left-=1;
}
printf("you won in %d round",round);    

}

您遇到分段错误,因为如果您没有输入整数,scanf 将不会 return 1,然后使用 g[i] 将调用 undefined behavior

FWIW,g 是一个局部自动数组变量,除非明确初始化,否则将具有不确定的值。尝试读取该值将调用 UB。

解决方案:

  1. 始终初始化局部变量。
  2. 万一scanf()失败,你需要吃掉 无效的输入,使用像[=13=这样的循环] 在继续进行下一个输入之前。

您正在读取一个数字,但用户可以放置一个数字。为防止这种情况,您可以使用库 stdlib.h 中的函数 atoi()。它将字符串转换为整数,如果整数只是数字,它将把它转换为整数。如果它是一个字符,它将 return 0。所以你只需要在调用 atoi() 函数后防止出现 0。