读取用户输入时fgets分段错误

这是使用ubuntu的违规代码

char *name; int main(void) { fgets(name, sizeof(name), stdin); } void HUD() { printf("%s ", name); } 

这是我的问题。 我开始使用scanf(“%s”,&name)并在字符串末尾收到垃圾邮件。 在过去的2个小时里一直在阅读scanf和fgets上的文档,因为当你不知道所需数组的大小时,显然不应该使用scanf(并且由于用户输入的大小不同)我决定尝试使用fgets。 我也试过用char name [100]设置一个固定值; 并通过fgets(name,100,stdin)

现在我得到了一个分段错误,通过阅读我在google的前两页找到的每个结果,我的语法看起来是正确的,我在cboard上找不到任何内容或在这里解决我的问题。

有任何想法吗?

sizeof(name)将是系统上指针的大小,在我的系统上是8个字节。 您可能一直期望的不是缓冲区的大小

char* name也是未初始化的。 您将尝试写入未初始化的缓冲区,它将以未定义的行为结束。

要解决,请将其设置为固定大小的缓冲区或在堆上分配一些空间。

分配

 #include  #include  #define NAME_SIZE 100 char *name; void HUD() { printf("%s ", name); } int main(void) { name=calloc(NAME_SIZE, sizeof(char)); fgets(name, NAME_SIZE, stdin); HUD(); free(name); } 

静态数组

 #include  #include  #define NAME_SIZE 100 char name[NAME_SIZE]; void HUD() { printf("%s ", name); } int main(void) { fgets(name, NAME_SIZE, stdin); HUD(); } 

您必须将缓冲区的大小传递给fgets以便知道它必须写入多少空间。

char *fgets(char *restrict s, int n, FILE *restrict stream);

fgets()函数必须从流中读取字节到s指向的数组,直到读取n-1个字节,或者读取a并将其传送到s,或者遇到文件结束条件。 然后以空字节终止该字符串。 [0]

您需要将其分配给特定大小并调用具有该大小的fgets。 这段代码可以帮助你完成同样的事情,但它有一个固定大小的缓冲区。

 #include  #include  char name; char* buffer; int buffer_size = 16; int i = 0; void HUD() { printf("%s ", buffer); } int main(void) { buffer = malloc(buffer_size); if(!buffer) return; for(;;) { name = getchar(); if(name < 0) { buffer[i] = '\0'; goto finish; } else if(i < (buffer_size -1)) { buffer[i++] = name; } else if(name == '\n') { break; } } buffer[i] = '\0'; finish: HUD(); free(buffer); return 0; } 

[0] http://pubs.opengroup.org/onlinepubs/009695399/functions/fgets.html