长度未知时获取用户输入的最佳方式? (C)

时间:2017-09-24 23:06:58

标签: c

尝试让用户输入多行输入,但我不知道他们的输入会有多长。我想我会想要使用char指针数组,但为什么不能使用以下代码呢?编译得很好,我只是得到意想不到的结果。

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

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

printf("You entered: '%s' and '%s'\n", x, y);

这是因为我正在初始化xy的方式吗?

2 个答案:

答案 0 :(得分:1)

没有办法简单地调整字符串大小。

如果输入长度未知,则基本上有两个选项:

  1. 只需限制输入的长度,并确保只在缓冲区内写入数据。这是常用的(例如硬盘驱动器上的文件名长度有限)
  2. 如果您真的想要动态增加缓冲区大小,则需要使用动态内存管理(malloccallocfreerealloc,... )。

    尝试以下链接获取startet:

  3. 如果您确实需要(或者如果您想学习),请仅使用数字2。

答案 1 :(得分:0)

此示例显示如何读取未知长度的一行用户输入。

#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;
}