C - 调用scanf()时的程序分段

时间:2010-01-27 14:31:20

标签: c segmentation-fault

我现在正在学习C,我直接从我正在使用的书中复制了这个小片段。当我运行它时会出现段错误,我无法弄清楚为什么,我通过gdb运行它并且它停在第9行scanf(“%s”,aName);但是打印变量的值不会带来任何可疑的外观。这件事有什么问题?

#include <stdio.h>

int nameLength(char[]);

main () {
  char aName[20] = {'\0'};

  printf("\nEnter your first name: ");
  scanf('%s', aName);
  printf("\nYour first name contains %d letters.", nameLength(aName));
}

int nameLength(char name[]) {
  int result = 0;
  while (name[result] != '\0') {
    result++;
  }
  return result;
}

编辑:我忘了提,它甚至没有显示提示或让我输入一个名字。它在执行后立即崩溃。

5 个答案:

答案 0 :(得分:9)

在列表中,您有'%s'而不是"%s" - 请注意单引号和双引号之间的差异。单引号分隔字符,双引号分隔字符串。 scanf()采用字符串第一个参数,因此您需要双引号。

答案 1 :(得分:4)

scanf('%s', aName);

使用双引号:

scanf("%s", aName);

或者确定:

scanf("%19s", aName);

将字符串限制为19个字符

答案 2 :(得分:3)

尝试用以下方法替换scanf:

scanf ("%s", aName);

请注意双引号。

...里奇

答案 3 :(得分:2)

在scanf中使用双引号

答案 4 :(得分:1)

如果这是一个计算字母数量的练习,那么您可以执行以下操作,但使用指针。

int nameLength(char *name)
{
    int i = 0;
    while(*name++) {
        i++;
    }
    return i;
}