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

问题描述:

试图让用户输入多行输入,但我不知道他们的输入时间是多长。我想我会想使用一个字符指针数组,但为什么不下面的代码工作?它编译好,我只是得到意想不到的结果。当长度未知时获取用户输入的最佳方式? (C)

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

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

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

是它的,因为我初始化xy的方式吗?

+0

是的。 ( –

+0

但我可以阅读长度超过2个字符的控制台 - 控制台窗口:111111 您输入了:'11111'和'111111' – Alex

+1

您可以但它是UB。如果用户手动输入字符串,只需要超大数组[1024]或其他内容,并在scanf中添加一个最大字段长度。 –

简单地调整字符串大小没有任何窍门。

如果输入长度是未知的,你基本上有两个选择:

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

    尝试以下链接获得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; 
}