
Vaibhav Agarval
Considere el siguiente código:
#include<stdio.h>
int main() {
int i=3, j=4;
scanf("%d c %d",&i,&j);
printf("%d %d",i,j);
return 0;
}
Funciona si doy 2c3
o 2 c 3
o 2c 3
como entrada si tengo que cambiar el valor de las variables. ¿Qué debo hacer si quiero que el usuario ingrese el mismo patrón que quiero? %dc%d
entonces solo 2c3
es aceptable y no 2 c 3
y viceversa si es %d c %d
?

Liho
Espacio en blanco en la cadena de formato coincide con 0 o más caracteres de espacio en blanco en la entrada.
Entonces "%d c %d"
espera número, luego cualquier cantidad de caracteres de espacio en blanco, luego carácter c
luego cualquier cantidad de caracteres de espacio en blanco y otro número al final.
"%dc%d"
número esperado, c
número.
También tenga en cuenta que si usa *
en la cadena de formato, suprime la asignación:
%*c
= leer 1 carácter, pero no asignarlo a ninguna variable
Entonces puedes usar "%d%*c c%*c %d"
si quieres fuerza usuario para ingresar: número, al menos 1 carácter seguido de cualquier cantidad de caracteres de espacio en blanco, c
al menos 1 carácter seguido de cualquier cantidad de espacios en blanco nuevamente y un número.
Si quieres aceptar 1c2
pero no 1 c 2
usa el patrón sin el espacio:
scanf("%dc%d", &x, &y);
Si quieres aceptar 1c2
y 1 c 2
(y también 1 \t \t c \t 2
etc), use el patrón con el espacio:
scanf("%d c %d", &x, &y);
Si quieres aceptar 1 c 2
pero no 1c2
agregue una cadena falsa que contenga espacios en blanco:
scanf("%d%*[ \t]c%*[ \t]%d", &x, &y);
Aquí la cadena de formato %[ \t]
significaría “leer una cadena que contiene cualquier número de espacios y tabulaciones”; pero usando el adicional *
se vuelve “suponer una cadena que contiene cualquier número de caracteres de espacio y tabulación; luego Descártalo“
Creo que leería el resultado de scanf en diferentes variables (es decir, no reutilizaría i
y j
) como "%d%s%d"
. Luego verifique la cadena que obtuvo del %s y si coincide con sus requisitos, use las otras variables para sobrescribir i y j.
Forzar un análisis de cadena primero:
char a[100], b[100];
scanf("%99s c %99s", a, b);
Luego use sscanf() para convertir las cadenas a int.