Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.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-调用scanf()时的程序分段错误_C_Segmentation Fault - Fatal编程技术网

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

C-调用scanf()时的程序分段错误,c,segmentation-fault,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(

我现在正在学习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;
}
#包括
int nameLength(char[]);
主要(){
字符名[20]={'\0'};
printf(“\n输入您的名字:”);
scanf(“%s”,aName);
printf(“\n您的名字包含%d个字母。”,名称长度(aName));
}
int nameLength(字符名[]){
int结果=0;
while(名称[结果]!='\0'){
结果++;
}
返回结果;
}
编辑:我忘了提到,它甚至没有显示提示或让我输入名称。它在执行后立即崩溃

scanf('%s', aName);
使用双引号:

scanf("%s", aName);
或者可以肯定的是:

scanf("%19s", aName);

要将列表中的字符串限制为19个字符,请使用
'%s'
而不是
'%s'
-注意单引号和双引号之间的差异。单引号分隔字符,双引号分隔字符串
scanf()
首先使用字符串参数,因此需要双引号。

在scanf中使用双引号

scanf ("%s", aName);
请注意双引号


…richie

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

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

用标准strlen函数代替nameLenght怎么样?你输入的名字有多长?你得到了答案,但是考虑使用其他的书。code>scanf在这种情况下使用不是一个安全的函数,而且具有上述代码的书也不会很好。使用fgets比使用scanf更安全。此外,您还应该检查返回代码,看看scanf是否成功返回。您可以推荐另一本书吗?您应该在正在使用的任何编译器中打开完整警告(例如-Wall for gcc)。它将以启蒙的形式带给你很多。这会抓住这个错误,并且可能会准确地告诉您出了什么问题。