C编程中的分段错误

时间:2011-01-18 00:56:55

标签: c

我开始学习C编程,在这个程序中,我试图获取用户输入,然后一次一行,并确定它是否包含非int字符。我一直在尝试这种方法:

scanf("%d", &n);
if (isalpha(n))
{
 i = -1;
}

我用Google搜索了一下,并了解函数isalpha是很好的方法。但是,每次我用非int字符(例如字母)测试上面的片段时,我都会遇到分段错误。任何建议都将不胜感激。

4 个答案:

答案 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()

以来
  1. 返回成功转化的次数,
  2. 输入流中存在非整数字符(不是数字或空格或符号)时停止,
  3. 你可以使用:

    #include <stdio.h>
    
    int main(void)
    {
        char n = 0;
        while (scanf("%c", &n) == 1)
            printf("you typed %d\n", n);
        return 0;
    }