Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: jorge_hura en 24 Julio 2013, 13:14 pm



Título: Pasar tipo const char* a char
Publicado por: jorge_hura en 24 Julio 2013, 13:14 pm
Hola buenas, soy principiante con esto de la programacion. En mi proyecto recibo una informacion a traves de un socket, esta se guarda en un espacio que he llamado recvBuff[512] (declarado como global). por el socket debe llegarme un caracter que luego tengo que comprobar de un array en que posicion del array esta. Mi problema es que al usar un stcmp dentro de un for para saber la posicion del arrray no me deja porque uno es char y el otro const char*. Hay alguna forma de transformar de un tipo al otro?? gracias. adjunto el codigo

pd: programando en C

Código:
#ifndef _WINDOWS_
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#undef WIN32_LEAN_AND_MEAN
#endif
#pragma comment( lib, "ws2_32.lib" )
#include <WinSock2.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <Ws2tcpip.h>

char comodin[512];
char SendBuff[512];
char RecvBuff[512];

char s2[512]= " ";

char tiempoCaracteres[]={"0123456789abcdefghijklmnopqrstuvwxyz,.;:+-*/!%&/()=?¿¡-}<>[]\n"};


int main(int argc, char *argv[]){
 
  WSADATA wsaData;
  SOCKET conn_socket;
  struct sockaddr_in server;
  struct hostent *hp;
  int resp,numero,p;
  char comodin,comodin2;
  int ClaseComando=0;
  char c;
  char comodin,comodin2;
  do{
  //Inicializamos la DLL de sockets
  resp=WSAStartup(MAKEWORD(1,0),&wsaData);
  if(resp){
    printf("Error al inicializar socket\n");
    getchar();return -1;
  }

  //Obtenemos la IP del servidor... en este caso
  // localhost indica nuestra propia máquina...
  hp=(struct hostent *)gethostbyname("192.168.0.5");

  if(!hp){
    printf("No se ha encontrado servidor...\n");
    getchar();WSACleanup();return WSAGetLastError();
  }

  // Creamos el socket...
  conn_socket=socket(AF_INET,SOCK_STREAM, 0);
  if(conn_socket==INVALID_SOCKET) {
    printf("Error al crear socket\n");
    getchar();WSACleanup();return WSAGetLastError();
  }
   
  memset(&server, 0, sizeof(server)) ;
  memcpy(&server.sin_addr, hp->h_addr, hp->h_length);
  server.sin_family = hp->h_addrtype;
  server.sin_port = htons(60);

  // Nos conectamos con el servidor...
  if(connect(conn_socket,(struct sockaddr *)&server,sizeof(server))==SOCKET_ERROR){
    printf("Fallo al conectarse con el servidor\n");
    closesocket(conn_socket);
    WSACleanup();getchar();return WSAGetLastError();
  }
  printf("Conexion establecida con: %s\n", inet_ntoa(server.sin_addr));
 
 
  //do{
printf("Escribe lo que deseas enviar(acabado en '.'):");
fflush (stdin);
gets(SendBuff);

  //Enviamos y recibimos datos... 
  printf("Datos enviados: %s \n", SendBuff);
  send(conn_socket,SendBuff,sizeof(SendBuff),0);
 
 
  //printf("Recibiendo Mensaje... \n");
  fflush (stdin);
  strcpy( RecvBuff, s2 );
  recv(conn_socket,RecvBuff, sizeof(RecvBuff), 0);
  printf("Datos recibidos: %s \n", RecvBuff);
 
 
 
  for(p=0 ; p<61 ; p++)
{

comodin=tiempoCaracteres[p];

if(strcmp(RecvBuff,comodin)==0)
{
numero = p;
printf("el numero del caracter es: %d", numero);
}

  }
   fflush (stdin);
  printf( "primero pulsa s para seguir enviando, despues escribe el comando deseado." );
  }while ( ( c = getchar() ) == 's'); 
 
  // Cerramos el socket y liberamos la DLL de sockets
  closesocket(conn_socket);
  WSACleanup();
  return EXIT_SUCCESS;
}


Título: Re: Pasar tipo const char* a char
Publicado por: eferion en 24 Julio 2013, 13:21 pm
strcmp lo que hace es comparar dos cadenas de caracteres y devolver un resultado que te indica si son iguales o no.

Tu, obviamente, no quieres eso.

Tu estás comparando char contra char... este chequeo es tan sencillo como:

Código
  1. for(p=0 ; p<61 ; p++)
  2. {
  3. comodin=tiempoCaracteres[p];
  4. if( comodin == recvBuff[ 0 ] )
  5. {
  6. numero = p;
  7. printf("el numero del caracter es: %d", numero);
  8. }
  9. }

Obviamente esto es asumiendo que el caracter a localizar sea el primero de los recibidos por el servidor.


Título: Re: Pasar tipo const char* a char
Publicado por: jorge_hura en 24 Julio 2013, 13:35 pm
Toda la razon no me habia dado cuenta, no lo puedo probar aun pero creo que me servira.

gracias eferion


Título: Re: Pasar tipo const char* a char
Publicado por: amchacon en 24 Julio 2013, 15:22 pm
Tu estás comparando char contra char... este chequeo es tan sencillo como:

Código
  1. for(p=0 ; p<61 ; p++)
  2. {
  3. comodin=tiempoCaracteres[p];
  4. if( comodin == recvBuff[ 0 ] )
  5. {
  6. numero = p;
  7. printf("el numero del caracter es: %d", numero);
  8. }
  9. }
Me parece mejor este otro método para comparar cadenas:

Código
  1.  
  2. int Diferencia = 0;
  3. int p;
  4. int Tamanyo_Cadena = strlen(Cadena1);
  5.  
  6. if (Tamanyo_Cadena != strlen(Cadena2) {} // Las cadenas no son iguales
  7.  
  8. else
  9. {
  10.  for(p=0 ; p < Tamanyo_Cadena; p++)
  11.  {
  12. Diferencia += Cadena1-Cadena2;
  13.  }
  14.  
  15.  if (Diferencia){} // Las cadenas no son iguales
  16.  else{} // Las cadenas son iguales
  17. }


Título: Re: Pasar tipo const char* a char
Publicado por: eferion en 24 Julio 2013, 15:23 pm
... No se trata de comparar cadenas... sino de localizar un caracter en un vector


Título: Re: Pasar tipo const char* a char
Publicado por: amchacon en 24 Julio 2013, 15:46 pm
... No se trata de comparar cadenas... sino de localizar un caracter en un vector
Huy, como había leído algo de strcmp y de comparar cadenas  :silbar:


Título: Re: Pasar tipo const char* a char
Publicado por: eferion en 24 Julio 2013, 16:06 pm
Ya, a mi al principio me pasó lo mismo... tuve que leerlo tranquilamente un par de veces para verlo claro jejeje


Título: Re: Pasar tipo const char* a char
Publicado por: rir3760 en 24 Julio 2013, 17:45 pm
Este bucle:
Código
  1. for (p = 0; p < 61; p++){
  2.   comodin = tiempoCaracteres[p];
  3.  
  4.   if (strcmp(RecvBuff,comodin) == 0){
  5.      numero = p;
  6.      printf("el numero del caracter es: %d", numero);
  7.   }
  8. }
Supongo tiene la intención de buscar cada uno de los caracteres de la cadena "tiempoCaracteres" en "RecvBuff" indicando el resultado.

Ello podría realizarse con strchr (prototipo en <string.h>) o un simple bucle pero hay problemas: para empezar no se trata de una cadena sino de una secuencia de bytes  y el numero de estos es el valor de retorno de la función recv.

Un saludo


Título: Re: Pasar tipo const char* a char
Publicado por: eferion en 24 Julio 2013, 17:56 pm
Ello podría realizarse con strchr (prototipo en <string.h>) o un simple bucle pero hay problemas: para empezar no se trata de una cadena sino de una secuencia de bytes  y el numero de estos es el valor de retorno de la función recv.

Efectivamente, lo que se envía por un socket es un vector de bytes... sin embargo, si ese vector de bytes se ha compuesto a partir de una cadena de caracteres... la conversión es directa y no da problemas.

Es decir, si yo envío "Hola", la cadena es 'H', 'O', 'L', 'A', '\0' y el vector de bytes tendrá exactamente la misma información. Si yo cojo ese vector de bytes y se lo enchufo a cout como un array de caracteres en la consola me va a imprimir "Hola"


Título: Re: Pasar tipo const char* a char
Publicado por: BlackZeroX en 24 Julio 2013, 21:05 pm
... No se trata de comparar cadenas... sino de localizar un caracter en un vector

¿Un caracter? strchr()

Dulces Lunas!¡.


Título: Re: Pasar tipo const char* a char
Publicado por: eferion en 24 Julio 2013, 21:12 pm
¿Un caracter? strchr()

Dulces Lunas!¡.

Con eso no consigues la posición ( en índice ) del carácter buscado.


Título: Re: Pasar tipo const char* a char
Publicado por: Eternal Idol en 24 Julio 2013, 21:37 pm
Con restarle el primer parametro que se le pasa a strchr obtenes el indice ... aca ejemplo:

http://www.cplusplus.com/reference/cstring/strchr/


Título: Re: Pasar tipo const char* a char
Publicado por: eferion en 25 Julio 2013, 07:30 am
Con restarle el primer parametro que se le pasa a strchr obtenes el indice ... aca ejemplo:

http://www.cplusplus.com/reference/cstring/strchr/

Eso lo se... pero yo creo que para alguien que más o menos está empezando entender que esos desplazamientos en memoria son iguales al index buscado puede no ser trivial


Título: Re: Pasar tipo const char* a char
Publicado por: Eternal Idol en 25 Julio 2013, 09:06 am
Eso lo se... pero yo creo que para alguien que más o menos está empezando entender que esos desplazamientos en memoria son iguales al index buscado puede no ser trivial

Si vos lo decis ... igual llamar a una funcion standard y hacer una resta es muy sencillo (mas que las otras propuestas) de programar y mantener, es solo cuestion de comprender el lenguaje.


Título: Re: Pasar tipo const char* a char
Publicado por: eferion en 25 Julio 2013, 09:18 am
lo se, y soy partidario de usar siempre, en la medida de lo posible, la librería estándard... pero yo he tenido que explicar a veces conceptos de programación a gente un poco novel y ha sido más fácil explicar primero el método cutre y luego, más adelante, el bueno.

Pues no he sufrido yo para que más de uno en mi universidad entendiese el tema de los punteros dobles y sus posibilidades...


Título: Re: Pasar tipo const char* a char
Publicado por: Eternal Idol en 25 Julio 2013, 09:50 am
Eso es problema del que pregunta, tiene libros, tutoriales, todo Internet para informarse sobre punteros.