2017-09-24 123 views
0

試圖讓用戶輸入多行輸入,但我不知道他們的輸入時間是多長。我想我會想使用一個字符指針數組,但爲什麼不下面的代碼工作?它編譯好,我只是得到意想不到的結果。當長度未知時獲取用戶輸入的最佳方式? (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

簡單地調整字符串大小沒有任何竅門。

如果輸入長度是未知的,你基本上有兩個選擇:

  1. 只是限制輸入的lenght並確保你只在緩衝區內寫入數據。這通常使用(例如文件名,你的硬盤上有一個有限的長度)
  2. 如果你真的想動態增加緩衝區的大小,你需要使用動態內存管理(malloccallocfreerealloc,.. )。

    嘗試以下鏈接獲得startet:

僅使用2號,如果你真的需要(或者,如果您想了解)。

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; 
} 
相關問題