Autor
|
Tema: Pasar tipo const char* a char (Leído 11,483 veces)
|
jorge_hura
Desconectado
Mensajes: 2
|
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; }
|
|
|
En línea
|
|
|
|
eferion
Desconectado
Mensajes: 1.248
|
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.
|
|
|
En línea
|
|
|
|
jorge_hura
Desconectado
Mensajes: 2
|
Toda la razon no me habia dado cuenta, no lo puedo probar aun pero creo que me servira.
gracias eferion
|
|
|
En línea
|
|
|
|
amchacon
Desconectado
Mensajes: 1.211
|
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 ); } }
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 }
|
|
|
En línea
|
|
|
|
eferion
Desconectado
Mensajes: 1.248
|
... No se trata de comparar cadenas... sino de localizar un caracter en un vector
|
|
|
En línea
|
|
|
|
amchacon
Desconectado
Mensajes: 1.211
|
... 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
|
|
|
En línea
|
|
|
|
eferion
Desconectado
Mensajes: 1.248
|
Ya, a mi al principio me pasó lo mismo... tuve que leerlo tranquilamente un par de veces para verlo claro jejeje
|
|
|
En línea
|
|
|
|
rir3760
Desconectado
Mensajes: 1.639
|
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
|
|
|
En línea
|
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
Desconectado
Mensajes: 1.248
|
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"
|
|
|
En línea
|
|
|
|
BlackZeroX
Wiki
Desconectado
Mensajes: 3.158
I'Love...!¡.
|
... No se trata de comparar cadenas... sino de localizar un caracter en un vector
¿Un caracter? strchr() Dulces Lunas!¡.
|
|
|
En línea
|
The Dark Shadow is my passion.
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
[?] cambiar una comparacion de const char * a metodo string.compare
Programación C/C++
|
Drakomorh
|
2
|
3,869
|
25 Mayo 2011, 18:58 pm
por Littlehorse
|
|
|
funcion System(const char* aString); ¿Se puede guerdar el valor de respuesta?
Programación C/C++
|
astinx
|
3
|
3,084
|
26 Febrero 2012, 01:11 am
por Eternal Idol
|
|
|
Pasar de const char* a int
Programación C/C++
|
eleon
|
4
|
5,355
|
15 Junio 2012, 16:09 pm
por durasno
|
|
|
Como pasar una cadena char a hexadecimal por argumento a un constant char?
Programación C/C++
|
ahaugas
|
3
|
5,686
|
13 Enero 2013, 14:09 pm
por ahaugas
|
|
|
(Ayuda) Error al modificar el valor de un char en una cadena const char *
Programación C/C++
|
Seyro97
|
4
|
8,231
|
2 Julio 2015, 15:17 pm
por Seyro97
|
|