2014-01-13 45 views
-1

我不断收到此错误段错误(核心转储)我不断收到此错误段错误(核心转储)

我的代码:

#include <stdio.h> 
#include <string.h> 

int main(void) 
{ 
    char name[80]; 
    int length[10]; 
    length == sizeof(name) 
    printf("What's your name?\n"); 
    scanf("%s", name); 
    printf("The length of your name is %s", length); 
} 

编辑

好了,这里是我的新代码

#include <stdio.h> 
#include <string.h> 

int main (void) 
{ 
    char name[20]; 
    printf("What is your name?\n"); 
    scanf("%s", name); 
    printf("There are %d letters in your name", strlen(name)); 
} 

而且它仍然不起作用。

+1

'length == sizeof(name)'不确定这是干什么卡在你的代码中间。您正在使用等号运算符而不是赋值运算符,并且没有结尾分号。另外,'sizeof'不会告诉你一个人甚至还没有输入过的名字的长度(参见'strlen'并将其称为正确的位置。)并且,如上所述,您正在使用'% s'打印一个'int'。 – Joe

+0

这并不需要太多的信息,但要注意格式说明符。特别是你的最后一个printf使用'%s',它需要一个字符串,但你传递一个int。这可能是。尽管这个问题没有太多的信息。 –

+0

@scott_fakename:他实际上传递了一个'int *'。 –

回答

8
printf("The length of your name is %s", length); 

%s是用于字符串。 int的格式说明符是%d。传入不匹配的类型会导致未定义的行为。

除此之外,您已声明length为int(错误)和length == sizeof(name)的数组1.检查是否相等,2.什么也不做,因为您不使用结果。这是一个无操作。即使您使用赋值运算符(=),它仍然是错误的,因为数组不可分配,并且返回值sizeof不是数组。

接下来的问题是,sizeof将返回数组的大小,以字节为单位,而不是您读入的字符串的长度。在这种情况下,sizeof name将始终返回80。要查找字符串的逻辑长度(直到空终止符的长度),请使用strlen。所以......

int main(void) 
{ 
    char name[80]; 
    printf("What's your name?\n"); 
    scanf("%s", name); 
    printf("The length of your name is %zu\n", strlen(name)); 
} 

最后,使用fgets代替scanf以避免缓冲区溢出。

fgets(name, sizeof name, stdin); 
+0

此外,编译器会检查不匹配的打印/扫描族格式说明符,这应该使这一点更加明显。确保您运行的编译器的所有警告。 –

+0

是的,我打算发表评论,并询问他使用的编译器。 –

+0

好吧,我这样做,并得到了以下错误消息'cc name.c -o名称 name.c:在函数'main'中: name.c:10:58:error:expected')'before';'token (“他们是你的名字中的%d个字母”,strlen(name);); ^ name.c:10:58:warning:格式'%d'需要'int'类型的参数,但参数2的类型为'size_t'[-Wformat =] make:*** [name]错误1 ' – mrnatbus12

0

长度==的sizeof(名称)

缺少 ';'在标识符'printf'之前。你应该在主函数中返回一个值。 (“你的名字的长度是%s”,长度);

%s是针对字符串的,您应该使用%d作为int。