1

因此,在 CI 中采用用户键盘输入的方法之一如下:

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 和检查缓冲区溢出的情况下扫描任意用户输入?

提前致谢!

4

5 回答 5

3

实际上两者都是错误的,因为您无法写入字符串文字(在您的两个示例中都buffer指向字符串文字)。

通过单个scanf. 您需要在循环中获取输入并不断添加到真实缓冲区。

是否有任何简单的方法可以在不使用 malloc 和检查缓冲区溢出的情况下扫描任意用户输入

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

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

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

于 2013-01-10T04:39:40.490 回答
1

char *buffer = "...";是完全错误的。这不是您分配内存的方式,因为双引号中的内容是字符串文字并且它是只读的。您可以像这样分配内存:

char buffer[1024];

或动态使用 malloc:

char *buffer = malloc(1024);

/* .... */

free(buffer);
于 2013-01-10T04:39:47.967 回答
1
 char* buffer = "";
 scanf("%s",buffer);
 printf("%s",buffer);

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

于 2013-01-10T05:05:15.827 回答
0

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

于 2013-01-10T05:21:37.063 回答
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);
于 2013-01-10T06:23:30.767 回答