Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C程序设计中的分段错误_C - Fatal编程技术网

C程序设计中的分段错误

C程序设计中的分段错误,c,C,我开始学习C编程,在这个程序中,我试图获取用户输入,然后一次获取一行,并确定它是否包含非整数字符。我一直在尝试这种方法: scanf("%d", &n); if (isalpha(n)) { i = -1; } 我在谷歌上搜索了一下,了解到函数isalpha是一个很好的方法。然而,每次我用非整数字符(例如字母)测试上面的片段时,我都会遇到一个分段错误。任何建议都将不胜感激。我不知道您为什么会出现seg故障。我得多看看你的节目 但是对scanf使用“%d”将只接受整数值,对于不是整数的

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

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读取整数