scanf混淆与类型错误

时间:2015-10-14 15:27:51

标签: c scanf

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

我遇到了一个问题,我只能输入整数。每次尝试键入*时,程序都会崩溃。我使用的条件如下:

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);    

}

2 个答案:

答案 0 :(得分:1)

您遇到分段错误,因为如果您没有输入整数,则scanf不会返回1,然后使用g[i]将调用http://www.am22tech.com/load-facebook-like-box-on-scroll-asynchronously/

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

解决方案:

  1. 始终初始化局部变量。
  2. 如果scanf()失败,您需要使用while (getchar != '\n');之类的循环吃掉无效的输入,然后再继续下一个输入

答案 1 :(得分:0)

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