读取用户

时间:2015-06-05 00:59:29

标签: c 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上找不到任何内容或在此处修复我的问题。

有什么想法吗?

2 个答案:

答案 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