Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[ayuda]Comparar una Cadena de Caracteres con un Array de Punteros

Estas en el tema de [ayuda]Comparar una Cadena de Caracteres con un Array de Punteros en el foro de C/C++ en Foros del Web. Buenas! Tengo una duda, pues, estoy haciendo un programa en el cual necesito comparar una cadena de caracteres con un array de punteros... sin embargo, ...
  #1 (permalink)  
Antiguo 16/10/2015, 19:44
 
Fecha de Ingreso: octubre-2015
Mensajes: 1
Antigüedad: 8 años, 6 meses
Puntos: 0
Pregunta [ayuda]Comparar una Cadena de Caracteres con un Array de Punteros

Buenas!

Tengo una duda, pues, estoy haciendo un programa en el cual necesito comparar una cadena de caracteres con un array de punteros... sin embargo, no entiendo como hacerlo...

Les explico como va mi codigo



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

using namespace std;

char *Estaciones[]={"estacion1","estacion2","estacion3"};
char *salida;
int i;

int main(){
cout<<"ESTACIONES:"<<endl;
i=0;
do{
cout<<Estaciones[i]<<endl;
i=i+1;
} while (i<=2);

cin>>salida;
}

yo quiero comparar el valor de Salida, con alguna de las estaciones...

es decir:

si yo coloco "estacion1" en el valor de SALIDA, lo comparo con los elementos del Arreglo, y luego sigo con el programa...

no tengo idea de como hacerlo.
  #2 (permalink)  
Antiguo 17/10/2015, 08:48
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 2 meses
Puntos: 3
Respuesta: [ayuda]Comparar una Cadena de Caracteres con un Array de Punteros

if (strcmp (Estaciones [i], Salida)==0){...}
  #3 (permalink)  
Antiguo 17/10/2015, 09:46
Avatar de xKuZz  
Fecha de Ingreso: febrero-2015
Ubicación: nullptr
Mensajes: 183
Antigüedad: 9 años, 2 meses
Puntos: 27
Respuesta: [ayuda]Comparar una Cadena de Caracteres con un Array de Punteros

Aparte de lo que aguml te ha comentado para poder comparar si ambos char* son iguales. Recuerda que para tu char* salida debes reservar la memoria necesaria para almacenar la palabra en concreto.
  #4 (permalink)  
Antiguo 17/10/2015, 15:11
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 2 meses
Puntos: 3
Respuesta: [ayuda]Comparar una Cadena de Caracteres con un Array de Punteros

Cita:
Iniciado por xKuZz Ver Mensaje
Aparte de lo que aguml te ha comentado para poder comparar si ambos char* son iguales. Recuerda que para tu char* salida debes reservar la memoria necesaria para almacenar la palabra en concreto.
Por supuesto. También recordar que no puedes asignar una cadena directamente, tienes que usar strcpy o strncpy o en su defecto copiarlo carácter a carácter al igual que para comparar también podría hacerlo carácter a carácter.
  #5 (permalink)  
Antiguo 17/10/2015, 21:08
 
Fecha de Ingreso: enero-2014
Mensajes: 60
Antigüedad: 10 años, 3 meses
Puntos: 1
Respuesta: [ayuda]Comparar una Cadena de Caracteres con un Array de Punteros

hola alejandrodr1903 veo que estas empezando en esto de c pero poco a poco se llega a todas partes
quieres comparar un array de punteros con una cadena de caracteres, no hablas nada de memoria dinamica asi que supongo que es un ejercicio para manejar punteros.

los punteros guardan direcciones de memoria, pero esas direcciones tienes que reservarla, ya sea estatica o dinamica por lo que "salida" apunta a una direccion arbitraria que no conocemos y al escribir ahi con cin puedes estar cargandote culalquier zona de la memoria.

si es un ejercicio imagino que no querran que el trabajo lo haga una funcion de la biblioteca estandar, si no lo es usala pues sera mas sencillo y eficiente.
voy a escribirte un codigo en c que hace lo que creo que quieres, sin utilizar la memoria dinamica.
ya me cuentas si he acertado y tu ya lo adaptas a lo que te piden en c++

siento no poder usar el resaltado pero cuando lo utizo me da problemas y no puedo enviar ni vista previa ;-(
  #6 (permalink)  
Antiguo 17/10/2015, 21:09
 
Fecha de Ingreso: enero-2014
Mensajes: 60
Antigüedad: 10 años, 3 meses
Puntos: 1
Respuesta: [ayuda]Comparar una Cadena de Caracteres con un Array de Punteros

Código c:
Ver original
  1. #include <stdio.h>
  2.  
  3. int main(){
  4.  
  5.     char *estaciones[]={"primavera","verano","otoño","invierno"}; // array de punteros
  6.     char salida[9]; //array con 10 elementos 9 + '\0' --> cadena de caracteres
  7.     int  n_estac=sizeof(estaciones)/sizeof(estaciones[0]); // numero de cadenas
  8.     int  encontrado=0; // marca si los caracteres coinciden
  9.  
  10.     printf("escribe con minúsculas el nombre de una estación del año: ");
  11.     scanf("%s", salida);
  12.  
  13.     for(int i=0; i<n_estac; i++) // combia de estacion
  14.         for(int ii=0; ; ii++) // recorre los caracteres de la estacion
  15.             if(estaciones[i][ii]=='\0' && salida[ii]=='\0' && encontrado>0){
  16.             // se ha llegado al final de las dos cadenas y el nombre coincide
  17.                 printf("\nhas escrito la estación número %i del año correctamente\n", i+1);
  18.                 return 0; // asi que lo visualizamos y cerramos el programa
  19.             }
  20.             else
  21.                 if(estaciones[i][ii]==salida[ii]) encontrado++;
  22.                 // el caracter comparado coincide
  23.                 else { encontrado=0; break; }
  24.                 // el caracter comparado no coincide asi que cambiamos de estacion con break
  25.     printf("\nel nombre que has escrito no es correcto\n\n");
  26.     // hemos recorrido todas las estaciones y no coincide ninguna
  27.     return 0;
  28. }
  #7 (permalink)  
Antiguo 17/10/2015, 21:11
 
Fecha de Ingreso: enero-2014
Mensajes: 60
Antigüedad: 10 años, 3 meses
Puntos: 1
Respuesta: [ayuda]Comparar una Cadena de Caracteres con un Array de Punteros

te añado este otro codigo que hace lo mismo (compara un array de punteros con una cadena de caracteres) y es casi igual pero utilizando punteros que son un poco mas eficientes ya que no hacen comprobaciones como los arrays.

Código c:
Ver original
  1. #include <stdio.h>
  2.  
  3. int main(){
  4.  
  5.     char *estaciones[]={"primavera","verano","otoño","invierno"};
  6.     char salida[9];
  7.     char **p_estac=estaciones, *p_salida=salida;
  8.     int  n_estac=sizeof(estaciones)/sizeof(estaciones[0]);
  9.     int  encontrado=0;
  10.  
  11.     printf("escribe con minúsculas el nombre de una estación del año: ");
  12.     scanf("%s", salida);
  13.  
  14.     for(int i=0; i<n_estac; i++)
  15.         for(int ii=0; ; ii++)
  16.             if(p_estac[i][ii]=='\0' && p_salida[ii]=='\0' && encontrado>0){
  17.                 printf("\nhas escrito la estación número %i del año correctamente\n", i+1);
  18.                 return 0;
  19.             }
  20.             else
  21.                 if(p_estac[i][ii]==p_salida[ii]) encontrado++;
  22.                 else { encontrado=0; break; }
  23.     printf("\nel nombre que has escrito no es correcto\n\n");
  24.     return 0;
  25. }

al final se ve que el problema era por ser la respuesta demasiado larga y la he troceado y si funciona
  #8 (permalink)  
Antiguo 18/10/2015, 15:57
 
Fecha de Ingreso: enero-2014
Mensajes: 60
Antigüedad: 10 años, 3 meses
Puntos: 1
Respuesta: [ayuda]Comparar una Cadena de Caracteres con un Array de Punteros

ahi va otro codigo:
Código c:
Ver original
  1. #include <stdio.h>
  2.  
  3. int main(){
  4.  
  5.     char *estaciones[]={"primavera","verano","otoño","invierno"};
  6.     char salida[9];
  7.     char **p_estac=estaciones, *p_salida=salida;
  8.     int  n_estac=sizeof(p_estac)/sizeof(p_estac[0]);
  9.  
  10.     printf("escribe con minúsculas el nombre de una estación del año: ");
  11.     scanf("%s", p_salida);
  12.     for(int i=0,ii,encontrado; i<n_estac; i++){
  13.         ii=encontrado=0;
  14.         while((p_estac[i][ii]==p_salida[ii]) && (p_salida[ii++]!='0')) encontrado++;
  15.         if(p_estac[i][--ii]=='\0' && p_salida[ii]=='\0' && encontrado>0){
  16.             printf("\nhas escrito la estación número %i del año correctamente\n", i+1);
  17.             return 0;
  18.     }   }
  19.     printf("\nel nombre que has escrito no es correcto\n\n");
  20.     return 0;
  21. }
suerte
  #9 (permalink)  
Antiguo 19/10/2015, 03:44
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: [ayuda]Comparar una Cadena de Caracteres con un Array de Punteros

Cita:
Iniciado por vizen Ver Mensaje
ahi va otro codigo:
Un par de detalles tontos:
  • si primavera tiene longitud 9... ¿por qué defines entrada con tamaño 9? jejejeje
  • ¿Has probado con otoño? la 'ñ' puesta a pelo va a dar problemas porque se va a codificar de forma diferente... es mejor usar la codificación '\xa4' para forzar al compilador a poner una 'ñ'... cosas de C y C++

y bueno, ya puestos a poner versiones, una más:

Código C++:
Ver original
  1. #include <iostream>
  2.  
  3. int main()
  4. {
  5.   const char *estaciones[]={"primavera","verano","oto\xa4o","invierno"};
  6.   char salida[10];
  7.   int idEstacion = -1;
  8.   const int n_estac=sizeof(estaciones)/sizeof(estaciones[0]);
  9.  
  10.   std::cout << "escribe con min\xa3sculas el nombre de una estaci\xa2n del a\xa4o: ";
  11.   std::cin >> salida;
  12.   for(int i=0; i<n_estac; i++)
  13.   {
  14.     const char* p_estac = estaciones[i];
  15.     for( char* p_salida=salida; *p_estac==*p_salida && *p_estac; ++p_estac, ++p_salida );
  16.  
  17.     if( !*p_estac )
  18.       idEstacion = i;
  19.   }
  20.  
  21.   if( idEstacion>=0 )
  22.     std::cout << "\nEstacion " << estaciones[idEstacion] << " encontrada\n";
  23.   else
  24.     std::cout << "\nel nombre que has escrito no es correcto\n\n";
  25.   return 0;
  26. }
  #10 (permalink)  
Antiguo 19/10/2015, 17:19
 
Fecha de Ingreso: enero-2014
Mensajes: 60
Antigüedad: 10 años, 3 meses
Puntos: 1
De acuerdo Comparar una Cadena de Caracteres con un Array de Punteros

hola eferion, me alegro de conocerte, te sigo cuando ayudas a la gente del foro, escribiendo siempre buen codigo
acabo de ver el dominio que tienes con los punteros que supera con mucho mis conocimientos

si tienes razon con el tamaño del array salida, debia estar en 10

la 'ñ' si que vi que utilizaba dos caracteres uno para la n y otro para el acento pero como tenia espacio de sobra no le di mas importancia, aunque si es muy buena idea pasarle el caracter en hexadecimal para no meter la pata en otra ocasion que vaya mas justo de espacio

sin embargo no se porque pero ejecutando tu programa no visualiza el codigo ascii correctamente cuando pide la estacion y si escribo otoño como estacion del año la da por mala, quizas sea algun fallo en mi configuracion, utilizo codeblocks en linux, no se donde tendre el fallo?

me ha encantado la manera de recorrer el array compacta, clara y eficiente

el unico problema que le he visto es que ignora lo que se escribe despues de la estacion y puedes escribir primaverada que la da por buena, la solucion que se me ha ocurrido es en la pregunta que hay despues del bucle preguntar si las dos cadena llegaron al final, ya que es la unica manera de que sean iguales.

gracias por todo eferion

aqui el cambio:

Código c:
Ver original
  1. for(int i=0; i<n_estac; i++){
  2.  
  3.    const char* p_estac = estaciones[i];
  4.    const char* p_salida=salida;
  5.  
  6.    for( ; *p_estac==*p_salida && *p_estac; ++p_estac, ++p_salida );
  7.  
  8.    if( *p_estac==*p_salida ) idEstacion = i;
  9. }
  #11 (permalink)  
Antiguo 20/10/2015, 02:36
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Comparar una Cadena de Caracteres con un Array de Punteros

Cita:
Iniciado por vizen Ver Mensaje
hola eferion, me alegro de conocerte, te sigo cuando ayudas a la gente del foro, escribiendo siempre buen codigo
acabo de ver el dominio que tienes con los punteros que supera con mucho mis conocimientos
Buenas vizen.

Al final todo es cuestión de práctica y de horas... montones de horas jejejeje.

C++ es un universo en sí mismo y lo normal es que aprendas algo nuevo al menos cada semana. Es complicadísimo dominar todas las facetas de C++. Siempre hay algún detalle que se te acaba escapando. Por eso estos foros son tan importantes... la gente se complementa con sus respuestas.

Cita:
Iniciado por vizen Ver Mensaje
la 'ñ' si que vi que utilizaba dos caracteres uno para la n y otro para el acento pero como tenia espacio de sobra no le di mas importancia, aunque si es muy buena idea pasarle el caracter en hexadecimal para no meter la pata en otra ocasion que vaya mas justo de espacio

sin embargo no se porque pero ejecutando tu programa no visualiza el codigo ascii correctamente cuando pide la estacion y si escribo otoño como estacion del año la da por mala, quizas sea algun fallo en mi configuracion, utilizo codeblocks en linux, no se donde tendre el fallo?
Puede ser que estés utilizando una codificación diferente... la 'ñ' no es un caracter estándar (es decir, no se encuentra en el alfabeto inglés), esto quiere decir que su codificación dependerá del juego de caracteres empleado. No es lo mismo UTF-8 que ANSI. Si no te funciona deberías probar a cambiar la codificación de la consola. Si echas un vistazo a, por ejemplo UTF-8 y ASCII verás que la parte correspondiente al alfabeto inglés es exactamente igual... esos son los caracteres estándar, el resto dependerán de la codificación que uses (salvo que emplees una codificación no latina)


Cita:
Iniciado por vizen Ver Mensaje
me ha encantado la manera de recorrer el array compacta, clara y eficiente
Muchas gracias.

Lo que intenté fue reducir la cantidad de código... si usas la variable como un puntero en vez de como un array puedes hacer lo mismo escribiendo menos. En este tipo de casos en concreto puede significar una mejoría en la legibilidad del código.

Cita:
Iniciado por vizen Ver Mensaje
el unico problema que le he visto es que ignora lo que se escribe despues de la estacion y puedes escribir primaverada que la da por buena, la solucion que se me ha ocurrido es en la pregunta que hay despues del bucle preguntar si las dos cadena llegaron al final, ya que es la unica manera de que sean iguales.
Cierto, hice un par de pruebas rápidas y, con las prisas, refactoricé después... craso error porque no tuve en cuenta esa posibilidad al poner el código final... las prisas...

Cita:
Iniciado por vizen Ver Mensaje
Gacias por todo eferion
De nada, gracias a tí por corregir el código.

Para cualquier cosa que necesites aquí estamos :)

Un saludo.

Etiquetas: cadena, caracteres, char, int, programa, punteros, string
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:09.