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。
解决方案:
- 始终初始化局部变量。
- 万一
scanf()
失败,你需要吃掉 无效的输入,使用像[=13=这样的循环] 在继续进行下一个输入之前。
您正在读取一个数字,但用户可以放置一个数字。为防止这种情况,您可以使用库 stdlib.h 中的函数 atoi()。它将字符串转换为整数,如果整数只是数字,它将把它转换为整数。如果它是一个字符,它将 return 0。所以你只需要在调用 atoi() 函数后防止出现 0。
我只是编写了一个程序来猜测数组中的一些随机对,如果猜对了,删除这对。
我遇到一个问题,我只能输入整数 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。
解决方案:
- 始终初始化局部变量。
- 万一
scanf()
失败,你需要吃掉 无效的输入,使用像[=13=这样的循环] 在继续进行下一个输入之前。
您正在读取一个数字,但用户可以放置一个数字。为防止这种情况,您可以使用库 stdlib.h 中的函数 atoi()。它将字符串转换为整数,如果整数只是数字,它将把它转换为整数。如果它是一个字符,它将 return 0。所以你只需要在调用 atoi() 函数后防止出现 0。