試圖讓用戶輸入多行輸入,但我不知道他們的輸入時間是多長。我想我會想使用一個字符指針數組,但爲什麼不下面的代碼工作?它編譯好,我只是得到意想不到的結果。當長度未知時獲取用戶輸入的最佳方式? (C)
char x[] = "";
scanf("%s", x);
char y[] = "";
scanf("%s", y);
printf("You entered: '%s' and '%s'\n", x, y);
是它的,因爲我初始化x
和y
的方式嗎?
試圖讓用戶輸入多行輸入,但我不知道他們的輸入時間是多長。我想我會想使用一個字符指針數組,但爲什麼不下面的代碼工作?它編譯好,我只是得到意想不到的結果。當長度未知時獲取用戶輸入的最佳方式? (C)
char x[] = "";
scanf("%s", x);
char y[] = "";
scanf("%s", y);
printf("You entered: '%s' and '%s'\n", x, y);
是它的,因爲我初始化x
和y
的方式嗎?
簡單地調整字符串大小沒有任何竅門。
如果輸入長度是未知的,你基本上有兩個選擇:
如果你真的想動態增加緩衝區的大小,你需要使用動態內存管理(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中添加一個最大字段長度。 –