读取用户输入时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