cómo comparar una variable string con una cadena en C

Iniciado por etcheverrypablol, 5 Febrero 2016, 11:56 AM

0 Miembros y 1 Visitante están viendo este tema.

etcheverrypablol

Chicos, en el siguiente código:

#include <stdio.h>

int main(){
   char mes[20];

   puts("Ingrese el nombre de un mes");
   scanf("%s",&mes);
   if(mes=="enero")
       puts("El mes ingresado es enero");
   return 0;
}

resulta que no es la forma correcta de comparar una variable string con una cadena, ya que no entra en el if. Cuál es el error.

Eternal Idol

Tu codigo esta comparando dos direcciones de memoria, tenes que usar funciones de comparacion de cadena como por ejemplo strcmp.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón


etcheverrypablol

#3
Bueno sí, acepto que no he buscado mucho en google.

Pude encontrar la solución. Hice uso de la funcion strncmp. La encontré por el comentario de Eternal.
De paso comento que el ejercicio que estaba resolviendo es este.

// Escribir un programa que acepte fechas escritas de modo usual y las visualice como tres números. Por ejemplo, la entrada: 15 febrero 2008 producirá la salida 15 2 2008.

#include <stdio.h>
#include <string.h>
int main(){
int dia;
char mes[20];
int anho;
char ene[]="enero";
char feb[]="febrero";
char mar[]="marzo";
char abr[]="abril";
char may[]="mayo";
char jun[]="junio";
char jul[]="julio";
char ago[]="agosto";
char sep[]="septiembre";
char oct[]="octubre";
char nov[]="noviembre";
char dic[]="diciembre";

puts("Ingrese una fecha escrita en modo usual, por ejemplo 7 noviembre 1991.");
scanf("%i %s %i",&dia,&mes,&anho);
if(!(strncmp(mes,ene,20)))
strcpy(mes,"1");
if(!(strncmp(mes,feb,20)))
strcpy(mes,"2");
if(!(strncmp(mes,mar,20)))
strcpy(mes,"3");
if(!(strncmp(mes,abr,20)))
strcpy(mes,"4");
if(!(strncmp(mes,may,20)))
strcpy(mes,"5");
if(!(strncmp(mes,jun,20)))
strcpy(mes,"6");
if(!(strncmp(mes,jul,20)))
strcpy(mes,"7");
if(!(strncmp(mes,ago,20)))
strcpy(mes,"8");
if(!(strncmp(mes,sep,20)))
strcpy(mes,"9");
if(!(strncmp(mes,oct,20)))
strcpy(mes,"10");
if(!(strncmp(mes,nov,20)))
strcpy(mes,"11");
if(!(strncmp(mes,dic,20)))
strcpy(mes,"12");

printf("La fecha ingresada es: %d %s %d",dia,mes,anho);
}

Me parece que este programa se podría optimizar, pero no concozco de las herramientas para hacerlo aún.
Saludos!

fary

Pues sería así.

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

int main()
{
   int dia;
   int anho;
   char mes[20];
   int i =0;

   char * meses[12] = {"enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "Octubre", "Noviembre", "diciembre"};
   
   puts("Ingrese una fecha escrita en modo usual, por ejemplo 7 noviembre 1991.");
   scanf("%i %s %i",&dia,&mes,&anho);
   
   for (i = 0; i < 12; i++)
   {
if (strcmp(meses[i], mes) == 0)
{
memset(mes,0,20);
itoa((i+1),mes,10);
break;
}
   }

   printf("La fecha ingresada es: %d %s %d",dia,mes,anho);

   return 0;
}
Un byte a la izquierda.

etcheverrypablol

#5
Hola fary.
Estoy muy agradecido por tu aporte. A raiz del mismo me he puesto a investigar y e aprendido un montón. Me costó mucho entender tu código, ya que contiene funciones que nunca había utilizado.

En este caso, no pude compilarlo, ya que contiene la función itoa. Me tira el error "referencia a itoa sin definir".
Busqué un reemplazo para la misma y me encontré con la función sprintf. El programa quedó así:

   #include <stdio.h>
   #include <stdlib.h>
   #include <string.h>
   
   int main()
   {
      int dia;
      int anho;
      char mes[20];
      int i =0;
      char * meses[12] = {"enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"};
   
      puts("Ingrese una fecha escrita en modo usual, por ejemplo 7 noviembre 1991.");
      scanf("%i %s %i",&dia,&mes,&anho);
   
      for (i = 0; i < 12; i++)
      {
         if (strcmp(meses, mes) == 0)
         {
            memset(mes,0,20);
            sprintf(mes,"%i",i+1);
            break;
         }
      }
   
      printf("La fecha ingresada es: %d %s %d",dia,mes,anho);
   
      return 0;
   }

Luego, analizando un poco más, me di cuenta de que no hacía falta utilizar la funcion itoa ni de la sprintf, y lo resolví de la siguiente manera:

   #include <stdio.h>
   #include <stdlib.h>
   #include <string.h>
   
   int main()
   {
      int dia;
      int anho;
      char mes[20];
      int i =0;
      char * meses[12] = {"enero", "febrero", "marzo", "abril", "mayo", "junio", "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre"};
   
      puts("Ingrese una fecha escrita en modo usual, por ejemplo 7 noviembre 1991.");
      scanf("%i %s %i",&dia,&mes,&anho);
   
      for (i = 0; i < 12; i++)
      {
         if (strcmp(meses, mes) == 0)
         {
            break;
         }
      }    
      printf("La fecha ingresada es: %d %i %d",dia,i+1,anho);
      return 0;
   }

Evidentemente este es un programa mucho más optimizado que el que hice en un principio. Nuevamente, les doy las gracias a todos!
Saludos :)

fary

#6
No había caído  :xD pero, claro. Le puedes dar el formato con printf.

Un saludo   :)

pd: es meses
Un byte a la izquierda.