Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: GilbertoBrewer en 26 Octubre 2014, 04:28 am



Título: Problema con cadena de caracteres en C.
Publicado por: GilbertoBrewer en 26 Octubre 2014, 04:28 am
Buenas noches o lo que sea cuando entren al tema.

Estoy llevando un curso de programación estructurada y hemos estado trabajando en lenguaje C utilizando Code::Blocks.

Me encargaron un programa en el cual debería guardar 10 cadenas de caracteres en una variable "nombre" y otras 10 en una variable "apellido", para después generar diez combinaciones aleatorias de nombre y apellido, y me mostrara la lista en pantalla.

Yo lo hice así:
Citar
#include <stdio.h>
#include <conio.h>
#include <string.h>

int main ()
{
    int p,i,g;
    char nombre[10][10]={"Pedro","Hugo","Oliver","Luis","Jesus","Natalia","Monserrat","Vanessa","Antonio","Jorge"};
    char apellido[10][10]={"Lopez","Perez","Rojas","Garcia","Martinez","Montes","Fox","Valdez","Diaz","Hidalgo"};
    char tipo[25];
    srand(time(NULL));

    for (p=0; p<10; p++)
    {
        i=rand()%10;
        g=rand()%10;
        sprintf(tipo,"%s %s",nombre,apellido[g]);
        puts(tipo);
    }

    return 0;
}

El problema está en que en algunos casos me imprime dos apellidos juntos o no me muestra el apellido, algo así:

Citar
Jorge FoxValdez
Pedro Valdez
Jorge
Luis PerezRojas

y no tengo idea de por qué pueda ser.

También intenté escribiendo:
Citar
strcpy(tipo,nombre);
        strcat(tipo," ");
        strcat(tipo,apellido[g]);
en lugar de:
Citar
sprintf(tipo,"%s %s",nombre,apellido[g]);
pero el resultado es algo similar.

¿Podrían ayudarme a encontrar el error de mi programa y/o recomendarme alguna forma de corregirlo o alguna manera alternativa de hacerlo?

De antemano, gracias.


Título: Re: Problema con cadena de caracteres en C.
Publicado por: leosansan en 26 Octubre 2014, 04:58 am
Buenas noches o lo que sea cuando entren al tema.


El problema está en que en algunos casos me imprime dos apellidos juntos o no me muestra el apellido, ...............................


Supongo que has puesto;:

Código
  1. sprintf(tipo,"%s %s",nombre[i],apellido[g]);

Es que al usar Cita en lugar de las etiquetas GeSHi el código que cuelgas no sale bien,

¡¡¡¡ Saluditos! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)



Título: Re: Problema con cadena de caracteres en C.
Publicado por: GilbertoBrewer en 26 Octubre 2014, 05:17 am
Ah, ok. Sí, ya vi el problema con la cita.

El código es así:
Código:
#include <stdio.h>
#include <conio.h>
#include <string.h>

int main ()
{
    int p,i,g;
    char nombre[10][10]={"Pedro","Hugo","Oliver","Luis","Jesus","Natalia","Monserrat","Vanessa","Antonio","Jorge"};
    char apellido[10][10]={"Lopez","Perez","Rojas","Garcia","Martinez","Montes","Fox","Valdez","Diaz","Hidalgo"};
    char tipo[25];
    srand(time(NULL));

    for (p=0; p<10; p++)
    {
        i=rand()%10;
        g=rand()%10;
        sprintf(tipo,"%s %s",nombre[i],apellido[g]);
        puts(tipo);
    }

    return 0;
}

También intenté escribiendo:
Código:
        strcpy(tipo,nombre)[i];
        strcat(tipo," ");
        strcat(tipo,apellido[g]);
en lugar de:
Código:
        sprintf(tipo,"%s %s",nombre[i],apellido[g]);

En ambos casos me muestra en la pantalla algo así:
Código:
Jorge FoxValdez
Pedro Valdez
Jorge
Luis PerezRojas


Título: Re: Problema con cadena de caracteres en C.
Publicado por: rir3760 en 26 Octubre 2014, 06:24 am
El programa debe funcionar correctamente si agregas al principio de este las directivas de inclusión:
Código
  1. #include <stdlib.h> /* srand y rand */
  2. #include <time.h>   /* time */

Y no es necesario que incluyas <string.h>, en cuanto a conio la deberías evitar por las razone que se indican en el tema |Lo que no hay que hacer en C/C++. Nivel basico| (http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html).

Un saludo


Título: Re: Problema con cadena de caracteres en C.
Publicado por: leosansan en 26 Octubre 2014, 06:29 am

También intenté escribiendo:

Citar
strcpy(tipo,nombre)[ i ];
        strcat(tipo," ");
        strcat(tipo,apellido[g]);
en lugar de:
Código:
        sprintf(tipo,"%s %s",nombre[i],apellido[g]);


Antes que nada elige en las etiquetas GeSHi la de C++ para que el código salga coloreado.

El [ i ] se te fue fuera del paréntesis:

Código
  1. strcpy ( tipo , nombre [ i ] ) ;

Y si usas strcpy y strcat si debes incluir la librería <string.h>.

¡¡¡¡ Saluditos! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)



Título: Re: Problema con cadena de caracteres en C.
Publicado por: GilbertoBrewer en 27 Octubre 2014, 23:10 pm
Ya corregí los errores y ya funcionó el programa.

Muchas gracias por las observaciones. :)


Título: Re: Problema con cadena de caracteres en C.
Publicado por: ShadowA7X en 28 Octubre 2014, 00:03 am
Recomendación personal amigo. Siempre cuando estés leyendo muchas cadenas de caracteres ocupa
Código
  1. fflush(stdin);

antes y/o despues de los scanf o los getch. Lo que hace esa función es limpiarte el buffer para que la próxima lectura no se vea afectada en ninguna medida por la lectura anterior. Siempre que quieras prevenir que algo malo pase con las lecturas de cadenas, ponlo (funciona como un parche por decirlo así  ;D). Si eso no lo soluciona entonces es un problema del código en si.


Eso, espero te sirva para afrontar futuros casos  :).


Título: Re: Problema con cadena de caracteres en C.
Publicado por: rir3760 en 28 Octubre 2014, 01:20 am
Recomendación personal amigo. Siempre cuando estés leyendo muchas cadenas de caracteres ocupa
Código
  1. fflush(stdin);
El uso de fflush(stdin) no se recomienda, las razones de ello en el tema |Lo que no hay que hacer en C/C++. Nivel basico| (http://foro.elhacker.net/programacion_cc/lo_que_no_hay_que_hacer_en_cc_nivel_basico-t277729.0.html).

Un saludo


Título: Re: Problema con cadena de caracteres en C.
Publicado por: GilbertoBrewer en 28 Octubre 2014, 20:46 pm
Sí había visto en ese tema que no es recomendable utilizar el fflush(stdin), pero no me quedó del todo claro el porqué.


Título: Re: Problema con cadena de caracteres en C.
Publicado por: avesudra en 28 Octubre 2014, 20:48 pm
Sí había visto en ese tema que no es recomendable utilizar el fflush(stdin), pero no me quedó del todo claro el porqué.
Porque la función fflush está definida para limpiar el estandar de salida (stdout), en cualquier otro caso el comportamiento de la función está indefinido. En Windows funciona, por el contrario en Linux no lo hace y Mac OS lo ignora.


Título: Re: Problema con cadena de caracteres en C.
Publicado por: GilbertoBrewer en 21 Noviembre 2014, 06:56 am
Buenas noches y muchas gracias por sus aportaciones.

Continuando con el mismo programa, ahora tengo que hacer que, una vez generada la lista con los 10 nombres y apellidos al azar, se organicen alfabéticamente.

El problema es que por alguna razón que desconozco completamente, no me muestra las cadenas como debería al intentar ordenarlas. Ya llevo horas tratando de ver dónde podría estar mal, pero no logro dar con lo que debo cambiar.

El programa lo hice así:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <time.h>
  5.  
  6. main ()
  7. {
  8.    char nombre[15][10]={"Pedro","Paco","Perla","Paola","Jorge","Jesus","Maria","Jose","Elisa","Angel"};
  9.    char apellido[15][10]={"Perez","Lopez","Barba","Cruz","Robles","Gomez","Gaytan","Duval","Derbez","Padilla"};
  10.    char nom[30][10];
  11.    char nomord[30][10];
  12.    char opcion;
  13.    int a,b,i,j,lugar,comparar,largo[10];
  14.    srand (time (NULL));
  15.  
  16.    printf ("Escoge una opcion:\n");
  17.        printf ("a-Generar 10 nombres\n");
  18.        printf ("b-Ordenarlos alfabeticamente\n");
  19.        printf ("s-Salir\n");
  20.        scanf("%s",&opcion);
  21.  
  22.    while (opcion!='s')
  23.    {
  24.        switch (opcion)
  25.        {
  26.        case 'a':
  27.            printf ("\nNombres:\n");
  28.            for (i=0; i<10; i++)
  29.            {
  30.                a=rand()%10;
  31.                b=rand()%10;
  32.                sprintf (nom[i],"%s %s%s",nombre[a],apellido[b],"\0");
  33.                largo[i]=strlen(nom[i]);
  34.                printf ("%d- %s - %d\n",i+1,nom[i],largo[i]);
  35.            }
  36.            printf ("\n");
  37.  
  38.            break;
  39.  
  40.        case 'b':
  41.            for (i=0; i<10; i++)
  42.            {
  43.                lugar=0;
  44.                for (j=0; j<10; j++)
  45.                {
  46.                    comparar=strcmp(nom[i],nom[j]);
  47.                    if (comparar>0)
  48.                    {
  49.                        lugar++;
  50.                    }
  51.                }
  52.                while (strcmp(nom[i],nomord[lugar])==0)
  53.                {
  54.                    lugar++;
  55.                }
  56.                sprintf (nomord[lugar],"%s%s",nom[i],"\0");
  57.            }
  58.  
  59.            for (i=0; i<10; i++)
  60.            {
  61.                printf ("%d - %s\n",i+1,nomord[i]);
  62.            }
  63.            break;
  64.        }
  65.  
  66.        printf ("Elige una opcion: ");
  67.        scanf ("%s",&opcion); //Lee una opcion; si se elige la "s" se sale del programa
  68.    }
  69.  
  70.    return 0;
  71. }
  72.  
  73.  

Al compilarlo y ejecutarlo, en pantalla siempre me muestra bien los 10 nombres, pero al elegir después la opción de ordenarlos me empalma los nombres y me muestra cadenas de hasta más de 50 caracteres, con varios nombres pegados uno tras otro.
¿Alguna ayuda al respecto? ¿A qué podría deberse eso y cómo lo corrijo?