¿La mejor manera de obtener la entrada del usuario cuando se desconoce la longitud? (DO)

Intento que el usuario ingrese varias líneas de entrada, pero no sé cuánto tiempo será su entrada. Creo que me gustaría usar una matriz de punteros de caracteres, pero ¿por qué no funciona el siguiente código? Se comstack bien, acabo de obtener resultados inesperados.

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

¿Es por la forma en que estoy inicializando y ?

No hay truco para simplemente obtener el tamaño de las cadenas.

Si la longitud de entrada es desconocida, básicamente tiene 2 opciones:

  1. Solo limite la longitud de la entrada y asegúrese de que solo escribe datos dentro del búfer. Esto se usa comúnmente (por ejemplo, los nombres de archivos en su disco duro tienen una longitud limitada)
  2. Si realmente desea boost dinámicamente el tamaño de su búfer, debe usar la administración de memoria dinámica ( malloc , calloc , free , realloc , …).

    Prueba estos enlaces para empezar:

Solo use el número 2 si realmente lo necesita (o si quiere aprender).

Este ejemplo muestra cómo leer una línea de entrada de usuario con longitud desconocida.

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