Лучший способ получить пользовательский ввод, когда длина неизвестна? (С)

Попытка заставить пользователя ввести несколько строк ввода, но я не знаю, как долго будет их вход. Я думаю, что я хотел бы использовать массив указателей символов, но почему этот код не работает? Он компилируется отлично, я просто получаю неожиданные результаты.

char x[] = ""; scanf("%s", x); char y[] = ""; scanf("%s", y); printf("You entered: '%s' and '%s'\n", x, y); 

Это из-за того, как я инициализирую x и y ?

Нет никакого трюка, чтобы просто resize строк.

Если длина ввода неизвестна, у вас в основном есть 2 варианта:

  1. Просто ограничьте длину ввода и убедитесь, что вы только записываете данные в буфер. Это обычно используется (например, имена файлов на вашем жестком диске имеют ограниченную длину)
  2. Если вы действительно хотите динамически увеличить размер буфера, вам необходимо использовать управление динамической памятью ( malloc , calloc , free , realloc , …).

    Попробуйте эти ссылки, чтобы получить startet:

Используйте только номер 2, если вам действительно нужно (или если вы хотите учиться).

В этом примере показано, как читать одну строку пользовательского ввода с неизвестной длиной.

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