Pasar tipo const char* a char

Iniciado por jorge_hura, 24 Julio 2013, 13:14 PM

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

jorge_hura

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

#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;
}

eferion

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:


for(p=0 ; p<61 ; p++)
{
comodin=tiempoCaracteres[p];
if( comodin == recvBuff[ 0 ] )
{
numero = p;
printf("el numero del caracter es: %d", numero);
}
}


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

jorge_hura

Toda la razon no me habia dado cuenta, no lo puedo probar aun pero creo que me servira.

gracias eferion

amchacon

Cita de: eferion en 24 Julio 2013, 13:21 PMTu estás comparando char contra char... este chequeo es tan sencillo como:


for(p=0 ; p<61 ; p++)
{
comodin=tiempoCaracteres[p];
if( comodin == recvBuff[ 0 ] )
{
numero = p;
printf("el numero del caracter es: %d", numero);
}
}
Me parece mejor este otro método para comparar cadenas:



int Diferencia = 0;
int p;
int Tamanyo_Cadena = strlen(Cadena1);

if (Tamanyo_Cadena != strlen(Cadena2) {} // Las cadenas no son iguales

else
{
  for(p=0 ; p < Tamanyo_Cadena; p++)
  {
Diferencia += Cadena1-Cadena2;
  }

  if (Diferencia){} // Las cadenas no son iguales
  else{} // Las cadenas son iguales
}
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

eferion

... No se trata de comparar cadenas... sino de localizar un caracter en un vector

amchacon

Cita de: eferion en 24 Julio 2013, 15:23 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:
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

eferion

Ya, a mi al principio me pasó lo mismo... tuve que leerlo tranquilamente un par de veces para verlo claro jejeje

rir3760

Este bucle:
for (p = 0; p < 61; p++){
   comodin = tiempoCaracteres[p];
   
   if (strcmp(RecvBuff,comodin) == 0){
      numero = p;
      printf("el numero del caracter es: %d", numero);
   }
}

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

eferion

Cita de: rir3760 en 24 Julio 2013, 17:45 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"

BlackZeroX

Cita de: eferion en 24 Julio 2013, 15:23 PM
... No se trata de comparar cadenas... sino de localizar un caracter en un vector

¿Un caracter? strchr()

Dulces Lunas!¡.
The Dark Shadow is my passion.