我开始学习C编程,在这个程序中,我试图获取用户输入,然后一次一行,并确定它是否包含非int字符。我一直在尝试这种方法:
scanf("%d", &n);
if (isalpha(n))
{
i = -1;
}
我用Google搜索了一下,并了解函数isalpha
是很好的方法。但是,每次我用非int字符(例如字母)测试上面的片段时,我都会遇到分段错误。任何建议都将不胜感激。
答案 0 :(得分:2)
%d
格式说明符强制scanf()
仅接受数字字符串。给定其他任何东西,它将失败并且n
未填充(假设您之前没有初始化n
,它将被垃圾填满)。
问题的症结在于isalpha()
期望一个0到255之间的值,并且有一个断言来强制执行它。至少在我的VC ++编译器上,当给定无效值时(在非调试模式下),它会导致访问冲突崩溃。
要解决此问题,您只需切换到%c
格式说明符即可。将n
转换为char
也是可取的,因为这样可以让您更清楚地阅读单个字符。
编辑:鉴于您在评论中的说明,您可以保留所有内容,只需检查scanf()
的返回值,而不是isalpha()
路线。它返回成功读取的值的数量,因此当遇到非整数或文件结尾时,它将返回0.例如:
int main() {
int n;
while (scanf("%d", &n)) {
printf("Got int: %d\n", n);
}
}
答案 1 :(得分:1)
我不知道为什么你会遇到一个段错误。我必须看到更多你的节目。
但是对scanf使用“%d”只会接受整数值,对于不是整数的n,你会得到“0”,因此isalpha(n)将始终为false,我将永远不会设置为 - 1。
也许你没有初始化我,因此它永远不会被设置。如果您稍后引用它,那可能是您的seg-fault的来源。
使用scanf(“%c”,& n),如下所示:
int main(char** argc, int argv) {
char n = 0;
int i = 0;
scanf("%c", &n);
if (isalpha(n)) {
i = -1;
}
printf("you typed %c, i=%d", n, i);
}
答案 2 :(得分:1)
确保您有一个字符缓冲区来存储值。将其扫描为字符串,然后使用isalpha()
:
char buffer[32];
sscanf("%32s", buffer);
// loop and check characters...
if(isalpha(buffer[i])) ....
注意使用%32s
,这是为了防止缓冲区溢出(32 ==缓冲区大小)
答案 3 :(得分:1)
鉴于n
是一个整数,我们可以诊断您正在读取n
中的值,该值不在0..255加EOF(通常为-1)的范围内,因此isalpha(n)
的代码正在执行以下操作:
(_magic_array[n]&WEIRD_BITMASK)
并且n
的值导致它访问内存失控,从而导致分段错误。
自scanf()
:
你可以使用:
#include <stdio.h>
int main(void)
{
char n = 0;
while (scanf("%c", &n) == 1)
printf("you typed %d\n", n);
return 0;
}