elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.


 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse)
| | |-+  C - Problema con scanf y string
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: C - Problema con scanf y string  (Leído 371 veces)
Xargam

Desconectado Desconectado

Mensajes: 6


Ver Perfil
C - Problema con scanf y string
« en: 15 Abril 2018, 20:21 »

Hola gente, estoy haciendo una funcion que pide string (caracteres limitados). Tengo una funcion en la que al scanf le asigne %[^\n] para que tome los espacios del string. Tambien quiero tener otra funcion que pida string hasta que encuentre un espacio, por lo que cambie la mascara por %s. Encontre un problema grave en esta segunda funcion:

Código
  1. void getRangedSimStr(char* vec,char message[],char eMessage[],int minChars, int maxChars)
  2. {
  3.    char palabra[1000];
  4.    printf("%s", message);
  5.    setbuf(stdin,NULL);
  6.    scanf("%s",palabra);
  7.    setbuf(stdin,NULL);
  8.    while(strlen(palabra) > maxChars || strlen(palabra) < minChars)
  9.    {
  10.        printf("%s",eMessage);
  11.        scanf("%s",palabra);
  12.        setbuf(stdin,NULL);
  13.    }
  14.    strcpy(vec,  palabra);
  15. }

Al momento de ser ejecutada en un bucle for de 3 iteraciones y guardado el string en una matriz con este codigo:

Código
  1.  
  2.    char matriz[CANT][CHARS];
  3.    char primeraLetra;
  4.    for(int i = 0; i< CANT; i++)
  5.    {
  6.        printf("Ingrese nombre %d: ",i+1);
  7.        getRangedSimStr(matriz[i],"","Nombre invalido, reingrese: ",1,49);
  8.        strlwr(matriz[i]);
  9.        primeraLetra = matriz[i][0];
  10.        primeraLetra = toupper(primeraLetra);
  11.        matriz[i][0] = primeraLetra;
  12.  
  13.    }
  14.    for(int i = 0; i < CANT; i++)
  15.    {
  16.        printf("%s\n",matriz[i]);
  17.    }
  18.  

Si yo escribo "SPORE ES BUENO" el bucle for no me pide la segunda y la tercera vez que ingrese string. Muestra la matriz con SPORE en indice 0, ES en el indice 1 y BUENO en el indice 2.
Miren:



En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.107



Ver Perfil
Re: C - Problema con scanf y string
« Respuesta #1 en: 15 Abril 2018, 21:22 »

Cambia lo de setbuf(stdin, NULL); por while(getchar()!='\n'); tal que así:
Código
  1. void getRangedSimStr(char* vec,char message[],char eMessage[],int minChars, int maxChars)
  2. {
  3.    char palabra[1000];
  4.    printf("%s", message);
  5.    scanf("%s",palabra);
  6.    while(getchar()!='\n');
  7.    while(strlen(palabra) > maxChars || strlen(palabra) < minChars)
  8.    {
  9.        printf("%s",eMessage);
  10.        scanf("%s",palabra);
  11.        while(getchar()!='\n');
  12.    }
  13.    strcpy(vec,  palabra);
  14. }
stdin, stdout y stderr todo y que son tratados como archivos no lo son, y por esa razón tienen sus manías.


En línea

while(is_alive(yourself)) {
    make_true(yourself, yourdreams);
}
Xargam

Desconectado Desconectado

Mensajes: 6


Ver Perfil
Re: C - Problema con scanf y string
« Respuesta #2 en: 15 Abril 2018, 21:41 »

Excelente ahora funcione perfecto!!! gracias pero no entendi que es lo que hace ese codigo... Si ingreso "spore es bueno", me queda " es bueno\n" en el buffer. Como un bucle while vacio limpia el buffer??'
« Última modificación: 15 Abril 2018, 21:52 por Xargam » En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.107



Ver Perfil
Re: C - Problema con scanf y string
« Respuesta #3 en: 15 Abril 2018, 22:40 »

Cuando capturas una frase que contenga espacios el %s de scanf adquiere datos hasta llegar al primer espacio en blanco.
Los datos restantes quedarán en el buffer y al volver a usar scanf adquirirá desde la última posición en que quedó.
Nosotros, al concluir un escrito con la tecla RETURN, añadimos al final de todo un carácter de nueva línea '\n' y eso lo podemos usar como marcador de final de buffer stdin.
Código:
while(getchar()!='\n');
hacemos que getchar vaya adquiriendo (y quitando) caracteres de uno en uno del buffer hasta que encuentre el de nueva línea, momento en que el bucle while se detendrá y el bucle quedará vacío.
En línea

while(is_alive(yourself)) {
    make_true(yourself, yourdreams);
}
Xargam

Desconectado Desconectado

Mensajes: 6


Ver Perfil
Re: C - Problema con scanf y string
« Respuesta #4 en: 16 Abril 2018, 04:10 »

Lo entendi muchas gracias compa!
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
pequeño problema con scanf(); « 1 2 »
Programación C/C++
orphen_nb 16 6,393 Último mensaje 16 Febrero 2006, 19:27
por Manibal_man
Problema con scanf en matrices
Programación C/C++
Baldore 2 1,986 Último mensaje 28 Abril 2009, 14:43
por Baldore
problema scanf
Programación C/C++
pMV2ere 4 1,138 Último mensaje 1 Noviembre 2013, 08:44
por vangodp
Problema al copiar string a un arreglo string dinamico VS2013 ultimate
Programación C/C++
raver1983 1 464 Último mensaje 7 Febrero 2017, 01:11
por raver1983
MOVIDO: C - Problema con scanf y string
Programación General
Eleкtro 0 38 Último mensaje 15 Abril 2018, 20:51
por Eleкtro
Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines