有人知道为什么我在运行此代码时会遇到段错误吗? Valgrind告诉我,我在第13行 if(!isdigit(x))上有“未初始化的4号值”,并且同一行上的读取大小2无效 - 地址未堆叠, malloc'd,或free'd。
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <stdbool.h>
int main()
{
int x;
printf("Please enter a number: ");
scanf("%d", &x);
if( !isdigit(x) )
{
printf("You entered %d\n", x);
}
else
{
printf("You did not enter a valid number!\n");
}
return 0;
}
答案 0 :(得分:1)
我认为问题是如果scanf
失败,x将被取消初始化。
最好在字符数组中输入数据。否则,您的代码没有任何意义,因为您无法在int类型的对象中输入非数字。此外,如果输入数字,使用函数isdigit
的结果可能会出乎意料。
答案 1 :(得分:1)
我用g ++编译你的代码,导致没有段错误。
输入值:
5,-1,27,43545gbb和gggg
产生了结果:
5,-1,27,43545和1729208414
答案 2 :(得分:0)
尝试以下方法:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int x = 0;
char a;
printf("Please enter a number: ");
while(scanf("%d%c",&x,&a) != 2 || a != '\n')
{
printf("Please enter an integer only : ");
do
{
scanf("%c",&a);
}while(a != '\n');
}
printf("You entered %d\n", x);
return 0;
}
代码向您展示了如何使用scanf的复杂方法。有关详细信息:Working of scanf and checking if input is int
根据c文档:isdigit
原型:
int isdigit( int ch );
参数:
ch - character to classify
目的:
检查给定字符是否为数字字符(0123456789)。 如果ch的值不能表示为 unsigned char 且不等于EOF,则行为未定义。
返回值:
如果字符是数字字符,则为非零值(true),否则为0(false)。
答案 3 :(得分:-1)
为什么第13行出现问题? 。第13行是if( !isdigit(x) )
在第8行创建x时,没有初始化x,
因此,如果输入了一个不可接受的值,并在第11行由scanf()
处理,则它将在到达isdigit()
函数时继续未初始化。
问题是isdigit()
期望输入必须是整数值在0到255之间的字符。任何其他值都将导致未定义的行为。 Segfaults是未定义行为的可能结果之一。
还有其他方法可以实现这一点,例如:
以下是使用char数组(字符串)的示例。请注意注释,以解释为什么某些事情已经完成。
int main()
{
//int x;
char x[2]; //Good for only one digit
printf("Please enter an integer with up to 10 digits: ");
//scanf("%d", &x);
scanf("%1s", x); //Edited to allow maximum field width of 1.
// if( !isdigit(x) )
if( isdigit(x[0]) ) //note the "!" was removed for logic to work
{
printf("You entered %d\n", atoi(x)); //note use of atoi() to convert string to int.
}
else
{
printf("You did not enter a valid number!\n");
}
return 0;
}