espacios en blanco en la cadena de formato (scanf)

3 minutos de lectura

avatar de usuario
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?

avatar de usuario
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 cluego cualquier cantidad de caracteres de espacio en blanco y otro número al final.

"%dc%d" número esperado, cnú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, cal menos 1 carácter seguido de cualquier cantidad de espacios en blanco nuevamente y un número.

  • Si bien es correcto, esto en realidad no responde a la pregunta de cómo proceder si desea insistir en espacios en blanco o sin espacios en blanco.

    – Vicky

    11 de octubre de 2012 a las 8:50

  • Esta respuesta implica incorrectamente que no se permiten espacios en blanco antes del número entero. "%dc%d" espera cualquier cantidad de espacios en blanco, números, 'c'cualquier cantidad de espacios en blanco, número.`.

    – chux – Reincorporar a Monica

    01/07/2016 a las 20:45


Si quieres aceptar 1c2 pero no 1 c 2usa 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 1c2agregue 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

  • El espacio antes "%d" en "%d c %d" es irrelevante – mismo resultado que "%d c%d". Los espacios en blanco serán aceptables incluso sin ese espacio inicial.

    – chux – Reincorporar a Monica

    1 de julio de 2016 a las 20:47


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.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad