C程序设计中的分段错误
我开始学习C编程,在这个程序中,我试图获取用户输入,然后一次获取一行,并确定它是否包含非整数字符。我一直在尝试这种方法:C程序设计中的分段错误,c,C,我开始学习C编程,在这个程序中,我试图获取用户输入,然后一次获取一行,并确定它是否包含非整数字符。我一直在尝试这种方法: scanf("%d", &n); if (isalpha(n)) { i = -1; } 我在谷歌上搜索了一下,了解到函数isalpha是一个很好的方法。然而,每次我用非整数字符(例如字母)测试上面的片段时,我都会遇到一个分段错误。任何建议都将不胜感激。我不知道您为什么会出现seg故障。我得多看看你的节目 但是对scanf使用“%d”将只接受整数值,对于不是整数的
scanf("%d", &n);
if (isalpha(n))
{
i = -1;
}
我在谷歌上搜索了一下,了解到函数
isalpha
是一个很好的方法。然而,每次我用非整数字符(例如字母)测试上面的片段时,我都会遇到一个分段错误。任何建议都将不胜感激。我不知道您为什么会出现seg故障。我得多看看你的节目
但是对scanf使用“%d”将只接受整数值,对于不是整数的n,您将得到“0”,因此isalpha(n)将始终为false,并且i将永远不会设置为-1
也许您没有初始化i,因此它从未设置过。如果您稍后引用它,这可能是seg故障的根源
使用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);
}
我不知道你为什么会有seg故障。我得多看看你的节目 但是对scanf使用“%d”将只接受整数值,对于不是整数的n,您将得到“0”,因此isalpha(n)将始终为false,并且i将永远不会设置为-1 也许您没有初始化i,因此它从未设置过。如果您稍后引用它,这可能是seg故障的根源 使用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);
}
确保您有一个字符缓冲区来存储值。将其作为字符串扫描,然后使用
isalpha()
:
注意使用
%32s
,这是为了防止缓冲区溢出(32==缓冲区大小)请确保您有一个字符缓冲区来存储值。将其作为字符串扫描,然后使用isalpha()
:
注意使用
%32s
,这是为了防止缓冲区溢出(32==缓冲区大小)格式说明符%d
强制scanf()
只接受数字字符串。如果有任何其他情况,它将失败并保留未填充的n
(假设您之前没有初始化n
,它将被垃圾填充)
问题的关键在于isalpha()
需要一个介于0和255之间的值,并且有一个断言来强制执行它。至少在我的VC++编译器上,当给定无效值(在非调试模式下)时,它会导致访问冲突崩溃
要解决这个问题,您只需切换到%c
格式说明符。将n
转换为char
也是可取的,因为这样可以使您读取单个字符的意图更加清晰
EDIT:根据您在评论中的说明,您可以保持一切不变,只需检查scanf()
的返回值,而不必走isalpha()
路线。它返回成功读取的值数,因此当遇到非整数或文件结尾时,它将返回0。例如:
int main() {
int n;
while (scanf("%d", &n)) {
printf("Got int: %d\n", n);
}
}
%d
格式说明符强制scanf()
只接受数字字符串。如果有任何其他情况,它将失败并保留未填充的n
(假设您之前没有初始化n
,它将被垃圾填充)
问题的关键在于isalpha()
需要一个介于0和255之间的值,并且有一个断言来强制执行它。至少在我的VC++编译器上,当给定无效值(在非调试模式下)时,它会导致访问冲突崩溃
要解决这个问题,您只需切换到%c
格式说明符。将n
转换为char
也是可取的,因为这样可以使您读取单个字符的意图更加清晰
EDIT:根据您在评论中的说明,您可以保持一切不变,只需检查scanf()
的返回值,而不必走isalpha()
路线。它返回成功读取的值数,因此当遇到非整数或文件结尾时,它将返回0。例如:
int main() {
int n;
while (scanf("%d", &n)) {
printf("Got int: %d\n", n);
}
}
假设
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;
}
#包括
内部主(空)
{
charn=0;
而(scanf(“%c”,&n)==1)
printf(“您键入了%d\n”,n);
返回0;
}
假设n
是一个整数,我们可以诊断您正在将一个值读入n
中,该值不在0..255加上EOF(通常为-1)的范围内,因此的代码是alpha(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;
}
#包括
内部主(空)
{
charn=0;
而(scanf(“%c”,&n)==1)
printf(“您键入了%d\n”,n);
返回0;
}
如何声明n?您是否检查了scanf的返回值?它告诉您分配了多少个输入项。n和i声明为什么?你能给出一些上下文吗?什么是“非整数字符”?我声明n,我简单地说:int n;int i@克里斯:你似乎混淆了整数(比如-10、50、10^99等等)和数字串(比如“90”、“000110”)。isalpha会告诉你像“a”这样的角色是否是a-z。它对一般整数没有任何意义,但%d读取整数