使用scanf从stdin获取任意长度输入

时间:2013-01-10 04:36:12

标签: c stdin scanf

因此,我知道在C中获取用户键盘输入的一种方法如下:

char buffer[LENGTH_KNOWN] = "";
scanf("%s",buffer);

我想知道是否有任何方法可以采取任意长度的用户输入。我尝试了以下内容,但最终得到了一个段错误。

char* buffer = "";
scanf("%s",buffer);
printf("%s",buffer);

然而,这似乎有效:

char* buffer = "TEST........keeps going....................."
scanf("%s",buffer);
printf("%s",buffer);

任何人都可以解释为什么我收到此错误并且有没有简单的方法来扫描任意用户输入而不使用malloc并检查缓冲区溢出?

提前致谢!

5 个答案:

答案 0 :(得分:3)

实际上两者都是错误的,因为你不能写一个字符串文字(在你的例子buffer中指向一个字符串文字)。

通过单个scanf无法获得任意长的输入。您需要在循环中获取输入并继续添加到实际缓冲区。

  

有没有简单的方法来扫描任意用户输入而不使用   malloc和检查缓冲区溢出

使用现成的功能为您完成。类似于getline(3)(不幸的是非标准)。

ssize_t getline (char **lineptr, size_t *n, FILE *stream)
  

此函数从流中读取整行,并存储文本   (包括换行符和终止空字符)在缓冲区中   并将缓冲区地址存储在*lineptr

答案 1 :(得分:1)

char *buffer = "...";完全错了。这不是你如何分配内存,因为双引号中的东西是一个字符串文字,它是只读的。您可以像这样分配内存:

char buffer[1024];

或动态使用malloc:

char *buffer = malloc(1024);

/* .... */

free(buffer);

答案 2 :(得分:1)

 char* buffer = "";
 scanf("%s",buffer);
 printf("%s",buffer);

在上面的代码中,您没有为缓冲区分配内存,因此为缓冲区分配内存并将值读入缓冲区。

答案 3 :(得分:0)

你永远不知道你可以读取多少字节,从而相应地分配内存。所以我猜你需要在循环中输入并添加到缓冲区中。

答案 4 :(得分:0)

char* buffer;

buffer = malloc(sizeof(char) * 1024); // 1024 is max user input length, or use whatever you want..

scanf("%s", buffer);

buffer = realloc (buffer, strlen(buffer) + 1); // re-allocating the buffer according  to user input..( + 1 for counting NULL character)

printf("%s",buffer);