Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Error de buffer al usar scanf

Estas en el tema de Error de buffer al usar scanf en el foro de C/C++ en Foros del Web. Buenos dias comunidad forosweb, hoy vengo por aqui debido a que tengo un problema en una funcion de un programa de registros que estoy elaborando, ...
  #1 (permalink)  
Antiguo 14/05/2014, 23:06
 
Fecha de Ingreso: enero-2014
Mensajes: 47
Antigüedad: 10 años, 9 meses
Puntos: 0
Error de buffer al usar scanf

Buenos dias comunidad forosweb, hoy vengo por aqui debido a que tengo un problema en una funcion de un programa de registros que estoy elaborando, busque bastante información sin embargo no he conseguido solución, el problema que tengo es el siguiente, en la funcion agregar registros de mi programa de registros, tengo declarada una variable que guardara el numero de registro, hasta aqui todo bien el problema reside si se coloca alguna letra o una cadena de caracteres el programa se bugea y se queda como en un ciclo infinito en vez de imprimir el mensaje de error, he buscando diversas formas de arreglar este error sin embargo no he conseguido solución dejo el codigo esperando sus buenos consejos saludos y gracias de antemano

Código C:
Ver original
  1. int agregar(void)
  2. {
  3. FILE *arc;
  4. int r,temp,i=0;
  5. arc=fopen("lista.dat","ab");
  6.     if(arc==NULL)
  7.     {
  8.        
  9.     puts("Error");
  10.     return 1;
  11.        
  12.     }  
  13.     else
  14.     {
  15.  
  16.     puts("Numero del PC que desea agregar");
  17.     scanf("%d",&temp);
  18.    
  19.            
  20.    
  21.                 if( (temp<1) || (temp>100))
  22.                 {
  23.                 puts("Numero de registro no valido");
  24.                 getch();
  25.                 system("cls");
  26.                 fclose(arc);
  27.                 return 1;
  28.                 }
  29.        
  30.        
  31.     fseek(arc,0,SEEK_END);
  32.     if(ftell(arc)!=0)
  33.     {
  34.         fclose(arc);
  35.         arc=fopen("lista.dat","rb");
  36.             if(arc==NULL)
  37.             {
  38.             puts("Error");
  39.             getch();
  40.             return 1;
  41.             }
  42.    
  43.         fread(&dat,sizeof(datos),1,arc);
  44.         while(!feof(arc))
  45.         {
  46.                 if(dat.n==temp)
  47.                 {
  48.                 puts("No  se pueden repetir los elementos del registro");
  49.                 getch();
  50.                 fclose(arc);
  51.                 return 1;
  52.                 }
  53.             fread(&dat,sizeof(datos),1,arc);
  54.         }
  55.    
  56.     }
  57.         fclose(arc);
  58.            
  59.     arc=fopen("lista.dat","ab");
  60.     if(arc==NULL)
  61.     {
  62.     puts("Error al abrir fichero");
  63.     exit(1);
  64.     }  
  65.  
  66.     dat.n=temp;
  67.    
  68.     puts("Marca ");
  69.     scanf("%s",&dat.marca);
  70.         puts("Modelo");
  71.     scanf("%s",&dat.modelo);
  72.         puts("Serial del case");
  73.     scanf("%s",&dat.cas);
  74.         puts("Serial del procesador");
  75.     scanf("%s",&dat.proc);
  76.         puts("Serial del monitor");
  77.     scanf("%s",&dat.mon);
  78.         puts("Serial del teclado");
  79.     scanf("%s",&dat.tecl);
  80.         puts("Serial del mouse");
  81.     scanf("%s",&dat.mou);
  82.         puts("Serial del camara");
  83.     scanf("%s",&dat.cam);
  84.         puts("Serial del regleta");
  85.     scanf("%s",&dat.reg);
  86.         puts("Serial de las cornetas");
  87.     scanf("%s",&dat.cor);
  88.         printf("Esta seguro de agregar esta PC al registro?");
  89.         puts("1.- SI    2.-NO");
  90.         scanf("%d",&r);
  91.             if(r==1)
  92.             {
  93.             fwrite(&dat,sizeof(datos),1,arc);
  94.             }
  95.            
  96.     }
  97.    
  98.     fclose(arc);
  99.     return 1;
  100. }
  #2 (permalink)  
Antiguo 15/05/2014, 00:00
Principe_Azul
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Error de buffer al usar scanf

Hola TriN, el error está acá:

Código C:
Ver original
  1. puts("Numero del PC que desea agregar");
  2.     scanf("%d",&temp);

el mismo programa no va a funcionar bien, porque está esperando un valor numérico y vos en algún momento le ingresas una letra, cosa que no debería ser así, porque la variable temp es un int, no una string ni un char, por lo tanto no pueden llevar letras dentro de él, sólo números.
Lo que debes hacer es guardar el dato en una variable tipo string o char, luego hacer una comparación si la variable por temp es toda numérica, de ser así, el programa seguiría con normalidad y ahí hacés el cambio de tipo de variables, por ejemplo si la variable temp es un char, entónces pasa de char a int, si la variable temp es una string, entónces pasá de string a int, luego de hacer la comparación si la variable temp es toda numérica, osea si tiene todo números dentro de ella, en el caso que se haya ingresado una letra, la condición no se cumplirá y el programa no dará error, simplemente le informará al usuario que solo ingrese un número de 1 a 100.

Te ayudaría con código, pero no sé las funciones que tiene C, debería haber algo como "isalnum" o "isnum", algo así, o también lo podés hacer creando una función y llamando a ella para que verifique caracter por caracter, para saber si son todos números.

Buena suerte.
  #3 (permalink)  
Antiguo 15/05/2014, 00:33
Avatar de Drewermerc  
Fecha de Ingreso: febrero-2014
Mensajes: 185
Antigüedad: 10 años, 9 meses
Puntos: 5
Respuesta: Error de buffer al usar scanf

hola TriN.
tiene razon principe_azul nesesitas hacer un comprobacion aqui te dejo un ejemplo de como usar isdigit para hacer esto en caso de que es valor sea entero devuelve 1 y sino de devuelve 0 nadamas aque aqui tendias que usar fgets en vez de escanf y arrays, aqui te dejo un ejemplo espero que te sirva.

Código C:
Ver original
  1. #include <stdio.h>
  2.     #include <stdlib.h>
  3.     #include <string.h>
  4.     #include <ctype.h>  
  5. int main ()
  6. {
  7.     char c[50];
  8.     int num, i, f;
  9.     printf("ingresa un valor\n");
  10.     fgets(c, 50,  stdin);
  11.     num = strlen(c);
  12.     for (i = 0; i < num-1 ; i++)
  13.     {
  14.        if (isdigit(c[i]) !=0)
  15.             printf("numero %c\n", c[i]);
  16.         else
  17.             printf("no valido\n"); 
  18.     }
  19.  
  20.     return 0;
  21. }

bueno espero que te sirva.
saludos.
Drewermerc.
  #4 (permalink)  
Antiguo 15/05/2014, 01:08
Avatar de Malenko
Moderador
 
Fecha de Ingreso: enero-2008
Mensajes: 5.323
Antigüedad: 16 años, 10 meses
Puntos: 606
Respuesta: Error de buffer al usar scanf

Y porque no usar atoi?
__________________
Aviso: No se resuelven dudas por MP!
  #5 (permalink)  
Antiguo 15/05/2014, 08:43
 
Fecha de Ingreso: enero-2014
Mensajes: 47
Antigüedad: 10 años, 9 meses
Puntos: 0
Respuesta: Error de buffer al usar scanf

Muchas gracias por sus respuestas ya investigare sobre eso y posteo el codigo cuando haya solucionado ! gracias nuevamente.
  #6 (permalink)  
Antiguo 15/05/2014, 09:35
 
Fecha de Ingreso: enero-2014
Mensajes: 47
Antigüedad: 10 años, 9 meses
Puntos: 0
Respuesta: Error de buffer al usar scanf

Hola amigos, ya he solucionado el problema, se me hizo mas entendible aplicar la funcion atoi, igualmente averiguare sobre otras funciones para convertir una variable char en int posteo el codigo y nuevamente muchas gracias.

Código C:
Ver original
  1. int agregar(void)
  2. {
  3. FILE *arc;
  4. int r,i=0;
  5. char ctemp[20];
  6. int ntemp;
  7. arc=fopen("lista.dat","ab");
  8.     if(arc==NULL)
  9.     {
  10.        
  11.     puts("Error");
  12.     return 1;
  13.        
  14.     }  
  15.     else
  16.     {
  17.  
  18.     puts("Numero del PC que desea agregar");
  19.     scanf("%s",&ctemp);
  20.    
  21.         if(atoi(ctemp)==0)
  22.         {
  23.         puts("Debe colocar solo numeros en el registro");
  24.         getch();
  25.         return 1;
  26.         }
  27.    
  28.     ntemp=atoi(ctemp);
  29.    
  30.                 if( (ntemp<1) || (ntemp>100))
  31.                 {
  32.                 puts("El numero de registro debe estar del 1 al 100");
  33.                 getch();
  34.                 system("cls");
  35.                 fclose(arc);
  36.                 return 1;
  37.                 }
  38.        
  39.        
  40.     fseek(arc,0,SEEK_END);
  41.     if(ftell(arc)!=0)
  42.     {
  43.         fclose(arc);
  44.         arc=fopen("lista.dat","rb");
  45.             if(arc==NULL)
  46.             {
  47.             puts("Error");
  48.             getch();
  49.             return 1;
  50.             }
  51.    
  52.         fread(&dat,sizeof(datos),1,arc);
  53.         while(!feof(arc))
  54.         {
  55.                 if(dat.n==ntemp)
  56.                 {
  57.                 puts("No  se pueden repetir los elementos del registro");
  58.                 getch();
  59.                 fclose(arc);
  60.                 return 1;
  61.                 }
  62.             fread(&dat,sizeof(datos),1,arc);
  63.         }
  64.    
  65.     }
  66.         fclose(arc);
  67.            
  68.     arc=fopen("lista.dat","ab");
  69.     if(arc==NULL)
  70.     {
  71.     puts("Error al abrir fichero");
  72.     exit(1);
  73.     }  
  74.  
  75.     dat.n=ntemp;
  76.    
  77.     puts("Marca ");
  78.     scanf("%s",&dat.marca);
  79.         puts("Modelo");
  80.     scanf("%s",&dat.modelo);
  81.         puts("Serial del case");
  82.     scanf("%s",&dat.cas);
  83.         puts("Serial del procesador");
  84.     scanf("%s",&dat.proc);
  85.         puts("Serial del monitor");
  86.     scanf("%s",&dat.mon);
  87.         puts("Serial del teclado");
  88.     scanf("%s",&dat.tecl);
  89.         puts("Serial del mouse");
  90.     scanf("%s",&dat.mou);
  91.         puts("Serial del camara");
  92.     scanf("%s",&dat.cam);
  93.         puts("Serial del regleta");
  94.     scanf("%s",&dat.reg);
  95.         puts("Serial de las cornetas");
  96.     scanf("%s",&dat.cor);
  97.         printf("Esta seguro de agregar esta PC al registro?");
  98.         puts("1.- SI    2.-NO");
  99.         scanf("%d",&r);
  100.             if(r==1)
  101.             {
  102.             fwrite(&dat,sizeof(datos),1,arc);
  103.             }
  104.            
  105.     }
  106.    
  107.     fclose(arc);
  108.     return 1;
  109. }
  #7 (permalink)  
Antiguo 15/05/2014, 09:53
Avatar de Drewermerc  
Fecha de Ingreso: febrero-2014
Mensajes: 185
Antigüedad: 10 años, 9 meses
Puntos: 5
Respuesta: Error de buffer al usar scanf

bueno esa tambien esa una opcion.
pero ami no me gusta ya que si introduces numero y despues letras no te daria la comprobacion que le pides y esta se pasaria como si nada y bueno el otro tipo de comprobacion te analiza cada numero o letraque se haya introducido.
saludos.
Drewermerc.

Última edición por Drewermerc; 15/05/2014 a las 11:23
  #8 (permalink)  
Antiguo 15/05/2014, 15:03
 
Fecha de Ingreso: enero-2014
Mensajes: 47
Antigüedad: 10 años, 9 meses
Puntos: 0
Respuesta: Error de buffer al usar scanf

Drewer tambien parece una buena opción pero como convertiria la cadena o el caracter ingresado a int ? ya que en tu codigo solo estas haciendo una comprobación mas no una asignación.
  #9 (permalink)  
Antiguo 15/05/2014, 15:36
Avatar de Drewermerc  
Fecha de Ingreso: febrero-2014
Mensajes: 185
Antigüedad: 10 años, 9 meses
Puntos: 5
Respuesta: Error de buffer al usar scanf

bueno pues hay puedes seguir usando la funcion atoi.
mira aqui te dejo un ejemplo de como quedaria.
Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <ctype.h>  
  5. int validar(char c[50]);
  6. int main ()
  7. {
  8.         char c[50];
  9.         int num, validarr;
  10.         printf("ingresa un valor\n");
  11.         fgets(c, 50,  stdin);
  12.         validarr = validar(c);
  13.         if (validarr == 0)
  14.         {
  15.             num = atoi(c);
  16.             printf("valor de ingresado: %d\n", num);
  17.         }
  18.         else
  19.             printf("numero no valido\n");
  20.      
  21.         return 0;
  22. }
  23. int validar(char c[50])
  24. {
  25.     int numero, i;
  26.     numero = strlen(c);
  27.         for (i = 0; i < numero-1 ; i++)
  28.         {
  29.            if (isdigit(c[i]) ==0)
  30.                 return 1;
  31.         }
  32.     return 0;
  33. }

bueno espero que te sirva si tienes alguna duda puedes preguntar.
saludos.
Drewermerc.
  #10 (permalink)  
Antiguo 15/05/2014, 23:22
 
Fecha de Ingreso: enero-2014
Mensajes: 47
Antigüedad: 10 años, 9 meses
Puntos: 0
Respuesta: Error de buffer al usar scanf

Hola Drewermerc, intentare aplicarlo a mi codigo gracias por tu respuesta.
  #11 (permalink)  
Antiguo 16/05/2014, 14:32
Principe_Azul
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Error de buffer al usar scanf

TriN puedes usar también este código de Drewermerc, que tan solo le hecho esta simple modificación:

Código C:
Ver original
  1. #include <stdio.h>
  2.     #include <stdlib.h>
  3.     #include <string.h>
  4.     #include <ctype.h>  
  5. int main ()
  6. {
  7.     char c[50];
  8.     int num, i, f;
  9.     printf("ingresa un valor\n");
  10.     fgets(c, 50,  stdin);
  11.     num = strlen(c);
  12.     int temp;
  13.     for (i = 0; i < num-1 ; i++)
  14.     {
  15.        if (isdigit(c[i]) !=0)
  16.             printf("numero %c\n", c[i]);
  17.             temp += c[i]            
  18.         else
  19.             temp = 0;
  20.             break;
  21.     }
  22.  
  23.     return 0;
  24. }

ahí declaramos la variable temp de tipo int, luego la variable toma el valor de cada caracter en caso que sea numérico, luego comparas que la variable temp no sea igual a 0, en el caso que si sea 0, entónces es porque hay una letra u otro caracter en la cadena y el programa detendrá el bucle y le dará el valor 0 a la variable temp, al ser 0 su valor, no se podrá avanzar con el programa, ahí tienes que ver que es lo que debes hacer si no ingresan un número.
Con 0 podrás saber que lo que ingresó el usuario no es un número.
  #12 (permalink)  
Antiguo 19/05/2014, 08:00
Avatar de leosansan  
Fecha de Ingreso: mayo-2012
Ubicación: GRAN CANARIA
Mensajes: 194
Antigüedad: 12 años, 5 meses
Puntos: 49
Respuesta: Error de buffer al usar scanf

Tan solo tienes que usar un bucle a la espera de que el valor introducido sea el correcto. Y para ello no es necesario el uso de librerías y/o funciones adicionales a stdio.h, las creas a tu medida:

Código C++:
Ver original
  1. #include <stdio.h>
  2.  
  3. int main (){
  4.   char c[50];
  5.   int num, i, flag, factor, lon;
  6.   do{
  7.     num=0, flag=0, factor=1, lon=0;
  8.     printf("Ingresa un valor: ");
  9.     scanf("%50s",c);
  10.     for (lon = 0; c[lon] ; lon++);
  11.     for (i = 0; c[i] ; i++)
  12.       if (c[i]<'0' ||c[i]>'9'){
  13.         flag=1;
  14.         break;
  15.       }
  16.     if (flag==0)
  17.       for (i = lon-1; i>=0 ; i--,factor*=10)
  18.         num+=(c[i]-'0')*factor;
  19.   }
  20.   while(num>100 || flag!=0);
  21.   printf("Valor ingresado: %d",num);
  22.   return 0;
  23. }

¡¡¡Saluditos!!!


Etiquetas: buffer, funcion, int, numero, programa, scanf, usar
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:41.