que programacion imprimir funcion dev caracteres cadena c char buffer scanf getchar

programacion - imprimir char en c



scanf/getchar trabajando correctamente solo la primera vez en el ciclo? (3)

Estoy intentando que el usuario ingrese un número tantas veces como quiera (y cree un nodo de lista vinculado para cada uno de los números).

Sin embargo, he probado varios métodos para borrar el buffer de entrada de caracteres, pero fue en vano. Extrañamente, el código se ejecutará una vez, pero no se ejecutará correctamente el segundo.

Por ejemplo, con el siguiente código, el terminal dice:

would you like to enter an integer? y Enter an integer: 4 would you like to enter an integer? y **program terminates**

Y antes cuando estaba usando scanf("%c", yesno); Ni siquiera podría ingresar ''y'' en la última línea. Simplemente terminó.

struct node *read_numbers(void){ struct node *first = NULL; int n; char yesno; yesno = ''y''; while( yesno == ''y''){ printf("Would you like enter an integer ((y) for yes/(n) for no):/n"); yesno = getchar(); while(getchar() != ''/n''); if(yesno == ''y''){ printf("Enter an Integer:"); scanf(" %d", &n); first = add_to_list(first, n); } else { return first; } } // end while }

Leí las entradas de caracteres y los búferes, y supuestamente el método getchar () debería funcionar. ¿Lo estoy utilizando mal? También probé scanf () con espacios adicionales antes y después del "% c", pero fue en vano.


¿Puedo recomendarle que use los fgets como una alternativa más segura a getchar y scanf ?

Como ha notado, estas funciones pueden almacenar en búfer la nueva línea y pasarla a la siguiente función que se lee desde la entrada estándar.

Con fgets puede almacenar la entrada en una matriz char y evitar tales problemas. Además, aún puede verificar fácilmente si la entrada consiste solamente de una nueva línea:

char user_input[10] = ""; printf("Would you like enter an integer ((y) for yes/(n) for no):/n"); /* get input or quit if only newline is entered, we only check the first char */ while(fgets(user_input, 3, stdin)[0] != ''/n'') { /* check if the first char is ''y'', quicker to do than using strcmp */ if(user_input[0] == ''y'') { int input = 0; printf("Enter an Integer: "); fgets(user_input, 5, stdin); /* get input again */ input = atoi(user_input); /* convert to int */ printf("Your integer is %d/n", input); printf("Would you like to go again? y/n:/n"); } else { return printf("No input there./n"); } }


Necesitas digerir la línea nueva después del scanf. Puedes hacer lo que estás haciendo arriba en el código:

scanf(" %d", &n); while(getchar() != ''/n''); first = add_to_list(first, n);


getchar es obtener los datos de stdin, while(getchar() != ''/n''); al igual que limpiar el buffer stdin. entonces el siguiente código puede funcionar correctamente