这是使用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上找不到任何内容或在此处修复我的问题。
有什么想法吗?
答案 0 :(得分:3)
sizeof(name)
将是系统上指针的大小,就我的8个字节而言。不像您可能期望的那样缓冲区的大小
同样char* name
未初始化。您将尝试写入未初始化的缓冲区,它将以未定义的行为结束。
要解决,请将其设置为固定大小的缓冲区或在堆上分配一些空间。
<强>分配强>
#include <stdio.h>
#include <stdlib.h>
#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 <stdio.h>
#include <stdlib.h>
#define NAME_SIZE 100
char name[NAME_SIZE];
void HUD()
{
printf("%s ", name);
}
int main(void)
{
fgets(name, NAME_SIZE, stdin);
HUD();
}
您必须将缓冲区的大小传递给fgets
,以便知道它必须写入多少空间。
答案 1 :(得分:-2)
INSERT INTO asce (idn, `keys`...
fgets()函数应从流中读取字节到数组中 s指向,直到读取n-1个字节,或读取a 转移到s,或遇到文件结束条件。该 然后使用空字节终止字符串。 [0]
您需要将其分配给特定大小并使用该大小调用fgets。这段代码可以帮助你完成同样的事情,但它有一个固定大小的缓冲区。
char *fgets(char *restrict s, int n, FILE *restrict stream);
[0] http://pubs.opengroup.org/onlinepubs/009695399/functions/fgets.html