Problema con cadena de caracteres en C.

Iniciado por GilbertoBrewer, 26 Octubre 2014, 04:28 AM

0 Miembros y 3 Visitantes están viendo este tema.

GilbertoBrewer

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:
Citarstrcpy(tipo,nombre);
        strcat(tipo," ");
        strcat(tipo,apellido[g]);
en lugar de:
Citarsprintf(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.

leosansan

#1
Cita de: GilbertoBrewer en 26 Octubre 2014, 04:28 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 (cpp) [Seleccionar]
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! ..... !!!!




GilbertoBrewer

Ah, ok. Sí, ya vi el problema con la cita.

El código es así:

#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:

        strcpy(tipo,nombre)[i];
        strcat(tipo," ");
        strcat(tipo,apellido[g]);

en lugar de:

        sprintf(tipo,"%s %s",nombre[i],apellido[g]);


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

rir3760

El programa debe funcionar correctamente si agregas al principio de este las directivas de inclusión:
#include <stdlib.h> /* srand y rand */
#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|.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

leosansan

#4
Cita de: GilbertoBrewer en 26 Octubre 2014, 05:17 AM

También intenté escribiendo:

Citarstrcpy(tipo,nombre)[ i ];
       strcat(tipo," ");
       strcat(tipo,apellido[g]);
en lugar de:

       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 (cpp) [Seleccionar]
strcpy ( tipo , nombre [ i ] ) ;

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

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




GilbertoBrewer

Ya corregí los errores y ya funcionó el programa.

Muchas gracias por las observaciones. :)

ShadowA7X

Recomendación personal amigo. Siempre cuando estés leyendo muchas cadenas de caracteres ocupa
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  :).

rir3760

Cita de: ShadowA7X en 28 Octubre 2014, 00:03 AMRecomendación personal amigo. Siempre cuando estés leyendo muchas cadenas de caracteres ocupa
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|.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

GilbertoBrewer

Sí había visto en ese tema que no es recomendable utilizar el fflush(stdin), pero no me quedó del todo claro el porqué.

avesudra

Cita de: 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é.
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.
Regístrate en