# Ansi C (Ayuda) cadena de caracteres



## Not (Ene 28, 2011)

Hola compañeros, tengo un problema con un programa que estoy haciendo

Bien me explico.

Tengo que hacer un programa que le introduzca varios nombres hasta que le introduzca la palabra _fin_, entonces mi pregunta es:

¿como puedo comparar una cadena de caracteres?

-No sé si la sintaxis esta mal hecha.
-Tambien creo que tengo problemas de lógica.

Creo que va ha ser más rápido enseñaros el programa:

# include <stdio.h>
# include <stdlib.h>

int main ()
{
    char nombres [21];

    printf ("Introduce una palabra:\n");

       gets(nombres);                                                   // Funciona como scanf//

    if (gets(nombres)!="fin")

       puts (nombres);                                                  //Funciona como printf//
    else    


    system ("pause");


}

Creo que la idea se ve, utilizo if else porque creo que es más fácil que un while o do while

Cualquier aporte será de ayuda, muchas gracias
un saludo


----------



## Estem (Ene 28, 2011)

en un principio podría utilizar strcmp() que es una función que compara dos cadenas, retorna 0 si es igual y distinto de cero si son distintas.

Disculpa si no soy suficientemente específico, es que hce 10 años que no programo en C. creo que debes declarar a string.h que es deonde está definida la función.

En el caso de main(), retorna un int al sistema, deberías colocar antes de la última llave la función return() con un valor de retorno al sistema , ejemplo cero que es que se ejecutó sin errores.ej

int main(void){

  printf("que tal!!!\n");

  return(0):
}


----------



## gzaloprgm (Ene 28, 2011)

Che, no tiene mucho que ver, pero si vas a usar "strings terminadas en \0" en C, NO USES GETS...

El problema es que no limita el largo de la cadena, así que si el usuario escribe una cadena más larga, se produce un buffer overflow y es posible usarlo para ejecutar código arbitrario... Ya se que en una aplicación tan sencilla no tiene la menor importancia, pero no uses gets en código para alguna aplicación real...

Es preferible usar
char buffer[BUFFERSIZE];
fgets(buffer, sizeof(buffer), stdin);

Más info: http://en.wikipedia.org/wiki/Gets

Respecto al problema original, como ya te respondieron, la función strcmp permite saber si dos cadenas son iguales o no...

Un saludo,
Gonzalo


----------



## Not (Ene 28, 2011)

Estem eso era lo que necesitaba, ya se como se usa strcmp(), llevo toda la tarde buscando algo parecido en google, pero no encontraba ninguna solución precisa.

Gracias a ti, problema resuelto.

gzaloprgm la verdad es que los ejercicios que tengo que hacer son de este estilo, lo que dices \0 es para terminar la cadena de caracteres ¿verdad?, pero uso la funcion gets, creo que el le introduce la \0 por defecto.

Gracias por todo!!!!


----------



## Estem (Ene 28, 2011)

con respecto a la lógica sería mas sencillo utilizar - do while - como bucle, y este sería un ejemplo:

programa principal...

do{
  pedir la cadena-[ej printf("Ingrese una palabra:"); ]
  tomar la caden-[ej scanf("%s",&cadena); ]
while( strcmp("fin", &cadena) !=0 );

fin del programa principal


----------



## Not (Ene 28, 2011)

Me acabo de dar cuenta de un problema.......(y yo cantando victoria)
Me habia parecido que hacia su funcion, pero la 1ª palabra que introduzco no la repite la 2ª si pero se sale el solo. Mientras voy a ver que hecho mal.

# include <stdio.h>
# include <stdlib.h>
# include <string.h>

int main ()
{
    int i;
    char nombres [21];
    char salir [21]="fin";

     printf ("Introduce varias palabras, cuando desee terminar escriba fin:\n");

do
  {   
    gets(nombres);
    i=strcmp( nombres, salir); 
    if (i>=0)
    {
       puts (nombres);
    }
    else
    {       
     return (0);
     }
  } 
  while (i>=1);

   system ("pause");  
}

gracias

============================================================================
Ya he dado con la solución, la verdad es que el if else dentro del do no hacia nada.
Aqui os dejo la solución final.


do
  {   
    gets(nombres);
    i=strcmp( nombres, salir); 
    puts (nombres);      

  } 
  while (i>=1);
   return (0);
   system ("pause");  
}
Ahora sale bien, pero hay un problema que no entiendo, es que cuando introduzco por ejemplo la letra 'a' sale del programa.
Muchas gracias a todos por todo


Losiento por ocupar tanto.....


----------



## Estem (Ene 28, 2011)

en donde pusiste system coloca return(0), borre el else y lo que pusiste entre las llaves a ver que sucede

sería bueno antes del gets colocar un printf("ingrese un nombre");

coloca en el while ( i > 0)


----------



## Not (Ene 28, 2011)

Tambien funciona, no pongo el printf antes del gets, por que si no estara cada palabra que intoduzco diciendome lo mismo.

Para llevar 10 años sin programar no se te da nada mal.

Muchas gracias


----------



## Estem (Ene 28, 2011)

Un abrazo.......


----------

