scanf no funciona como se esperaba

3 minutos de lectura

Traté de ejecutar el siguiente código simple en ubuntu 15.10 pero el código se comporta de manera extraña de lo esperado

#include<stdio.h>
int main(){
int n,i=0;
char val;
char a[20];

printf("\nEnter the value : ");
scanf("%s",a);
printf("\nEnter the value to be searched : ");
scanf("%c",&val);

int count=0;
for(i=0;i<20;i++){
 if(a[i]==val){
   printf("\n%c found at location %d",val,i);
   count++;
 }
}
printf("\nTotal occurance of %c is %d",val,count);
   return 0;
}

output:
--------------------------
Enter the value : 12345678
Enter the value to be searched : 
Total occurance of is 0

El segundo scanf para obtener el valor a buscar parece no funcionar. El resto del código se ejecuta después del primer scanf sin recibir entrada por segunda vez.

  • 1) scanf("%c",&val); –> scanf(" %c",&val); 2) i<20 –> i<20 && a[i] 3) scanf("%s",a); –> scanf("%19s", a); (i<20 –> ia[i])

    – PIXY AZUL

    25 de diciembre de 2015 a las 3:47


  • ia[i] mi error tipográfico como a[i]

    – PIXY AZUL

    25 de diciembre de 2015 a las 4:00

  • ¿Por qué no comprobar el valor de retorno de scanf? También haz que no invada la matriz.

    – Ed Heal

    25 de diciembre de 2015 a las 4:15

  • Si está TAN aullando de angustia al respecto, scanf() está funcionando exactamente como se esperaba.

    – 15ee8f99-57ff-4f92-890c-b56153

    25 de diciembre de 2015 a las 4:27

  • %c acepta ‘\n’, 12345678(Intro) -> 12345678’\n’

    – Kun Ming Xie

    25 de diciembre de 2015 a las 4:45


avatar de usuario
Ferit

Después del primer scanf(), en cada scanf(), en la parte de formato, coloque un espacio en blanco

Así que cambia esto

scanf("%c",&val);

dentro de esto

scanf(" %c",&val);

La razón es que scanf() regresa cuando ve una nueva línea, y cuando se ejecuta scanf() por primera vez, escribe input y presiona enter. scanf() consume su entrada pero no la nueva línea restante, por lo tanto, después de scanf() consume esta nueva línea restante.

Poner un espacio en blanco en la parte de formato hace que la nueva línea restante se consuma.

avatar de usuario
orestisf

Puedes usar fgets():

#include<stdio.h>
int main() {
    int n, i = 0;
    char val;
    char a[20];

    printf("\nEnter the value : ");
    fgets(a, 20, stdin);
    printf("\nEnter the value to be searched : ");
    scanf("%c", &val);

    int count = 0;
    for (i = 0; i < 20; i++) {
        if (a[i] == val) {
            printf("\n%c found at location %d", val, i);
            count++;
        }
    }
    printf("\nTotal occurance of %c is %d", val, count);
    return 0;
}

o claro stdin:

#include<stdio.h>

void clearstdin(void) {
    int c;
    while ((c = fgetc(stdin)) != EOF && c != '\n');
}

int main() {
    int n, i = 0;
    char val;
    char a[20];

    printf("\nEnter the value : ");
    scanf("%s",a);
    clearstdin();
    printf("\nEnter the value to be searched : ");
    scanf("%c", &val);

    int count = 0;
    for (i = 0; i < 20; i++) {
        if (a[i] == val) {
            printf("\n%c found at location %d", val, i);
            count++;
        }
    }
    printf("\nTotal occurance of %c is %d", val, count);
    return 0;
}

Además, consulte C: Múltiples escaneos, cuando ingreso un valor para un escaneo, se salta el segundo escaneo.

printf("\nEnter the value : ");
scanf("%s",a);
printf("\nEnter the value to be searched : ");
scanf("%d",&val);   // here is different

No sé por qué, pero el código anterior funciona …

scanf("%d",&val);

  • scanf borra los espacios en blanco excepto cuando el formato de carácter (%c) se utiliza. En el ejemplo de OP escribiendo 12345678 y al pulsar enter significa que a obtiene 12345678 y hay una nueva línea ('\n') carácter en el búfer estándar. %d lo quita pero %c no

    – orestisf

    25 de diciembre de 2015 a las 4:19

Puede usar ” %c” en lugar de “%c” para la cadena de formato. El espacio en blanco hace que scanf() omita los espacios en blanco (incluidas las nuevas líneas) antes de leer el carácter.

¿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