当长度未知时获取用户输入的最佳方式? (C)
问题描述:
试图让用户输入多行输入,但我不知道他们的输入时间是多长。我想我会想使用一个字符指针数组,但为什么不下面的代码工作?它编译好,我只是得到意想不到的结果。当长度未知时获取用户输入的最佳方式? (C)
char x[] = "";
scanf("%s", x);
char y[] = "";
scanf("%s", y);
printf("You entered: '%s' and '%s'\n", x, y);
是它的,因为我初始化x
和y
的方式吗?
答
简单地调整字符串大小没有任何窍门。
如果输入长度是未知的,你基本上有两个选择:
- 只是限制输入的lenght并确保你只在缓冲区内写入数据。这通常使用(例如文件名,你的硬盘上有一个有限的长度)
-
如果你真的想动态增加缓冲区的大小,你需要使用动态内存管理(
malloc
,calloc
,free
,realloc
,.. )。尝试以下链接获得startet:
仅使用2号,如果你真的需要(或者,如果您想了解)。
答
此示例显示如何读取一行未知长度的用户输入。
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
// This constant is small so you can easily examine how this code works in debugger
// Buffer increase step
#define BUFSTEP 5
int main()
{
char *in_str_buf;
size_t buf_len;
size_t str_len;
in_str_buf = NULL;
buf_len = 0;
str_len = 0;
// Read string by parts
do
{
char *in_str_buf_new;
if ((in_str_buf_new = realloc(in_str_buf, buf_len + BUFSTEP)) == NULL)
{
// realloc failed
free(in_str_buf);
return -1;
}
in_str_buf = in_str_buf_new;
buf_len += BUFSTEP;
if (fgets(in_str_buf + str_len, buf_len - str_len, stdin) == NULL)
{
// Error or end-of-file condition occured
if (ferror(stdin))
{
free(in_str_buf);
return -2;
}
if (feof(stdin))
{
break;
}
}
str_len = strlen(in_str_buf);
}
while (str_len && in_str_buf[str_len-1] != '\n');
// Remove newline for convenience
in_str_buf[str_len ? str_len - 1 : 0] = '\0';
printf("Whole string: %s\n", in_str_buf);
free(in_str_buf);
return 0;
}
是的。 ( –
但我可以阅读长度超过2个字符的控制台 - 控制台窗口:111111 您输入了:'11111'和'111111' – Alex
您可以但它是UB。如果用户手动输入字符串,只需要超大数组[1024]或其他内容,并在scanf中添加一个最大字段长度。 –