Stack Overflow en español Asked by plazamarco on November 22, 2021
Si en el primer scanf coloco dos valores ejemplo "Marco Antonio" separados por un espacio automáticamente el 2do scanf no me pregunta nada y me toma como valor introducido el "Antonio".
¿Como hago para por lo menos evitar eso?
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
system("clear");
char apellido[30],
nombre[30];
printf("Nombre: ");
scanf("%30s", nombre);
printf("Apellido: ");
scanf("%30s", apellido);
printf("Mi nombre es %s y mi apellido es %s. n", nombre, apellido);
return 0;
}
La entrada estándar en C funciona de la siguiente manera:
Lo que sucede en este código es que, ante la entrada "Marco Antonion"
el programa no sale del primer scanf
hasta que no se ha introducido el salto de línea... entonces empieza a leer y procesa la primera palabra "Marco"
, después le llega el turno al segundo scanf
que ve que sigue habiendo contenido en el buffer... y es cuando procesa la segunda palabra "Antonio"
y elimina el salto de línea, por lo que un tercer scanf
se quedaría esperando a que el usuario introdujese nuevos valores.
¿Como hago para por lo menos evitar eso?
Pues depende:
Si tu idea es que tanto el nombre como el apellido puedan tener espacios tendrás que configurar scanf
de forma diferente:
scanf("%[^n]%*c", nombre);
De esta forma scanf
no se detendrá en el primer espacio sino en el salto de línea. La explicación a esa entrada es la siguiente:
%[^n]
indica a scanf
que debe leer hasta encontrar un salto de línea%*c
esta opción lee un único caracter (el salto de linea). El asterisco indica a scanf
que debe descartar dicho caracter.Si tu idea es descartar la segunda palabra, tendrás que vaciar el buffer de entrada a mano. No hay una forma estándar de realizar esto, pero una de las más utilizadas es la siguiente:
int c;
while ((c = getchar()) != 'n' && c != EOF);
Introduce estas lineas después de tu scanf
y así descartarás todo lo que haya en el buffer de entrada hasta el primer salto de línea (que también se descartará)
Answered by eferion on November 22, 2021
Cambia la lectura mediante scanf
por una lectura mediante fgets
:
printf("Nombre: ");
fgets(nombre, 30, stdin);
printf("Apellido: ");
fgets(apellido, 30, stdin);
Ten en cuenta que también te leerá el carácter de final de salto de línea.
Answered by PaperBirdMaster on November 22, 2021
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP