Convertir de char * a int

Mi código falla y devuelve un número realmente grande:

#include  int main() { char *s = "hello123"; printf("%d\n",*(int *)s); return 0; } 

Con atoi devuelve 0, ¿alguna idea?

Lo que estoy intentando lograr es: por ejemplo, estoy enviando “hello123” a un software de servidor, el software del servidor debería obtener el número “123” en la cadena, haciendo esto por este método:

 uint16_t get_uint16(NetworkMessage *message) { uint16_t ret = 0; if (!message || !message->buffer) return 0; ret = *(uint16_t *)(message->buffer + message->position); message->position += sizeof(uint16_t); return ret; } 

Esto supone que su cadena tiene dos partes, las primeras señales con caracteres (por ejemplo, hello ) y las últimas con el número (por ejemplo, 123 ). Por lo que entiendo de tus comentarios, esto es lo que querías hacer.

 #include  #include  int main() { char* s = "hello123"; char* num_ptr = s; while(*num_ptr < '0' || *num_ptr > '9') ++num_ptr; int number = atoi(num_ptr); printf("%d\n", number); return 0; } 

Después de editar: ¿Intentar eso? Supongo que message_buffer contiene su mensaje y es de tipo char*

 int get_number(char* message_buffer) { char* num_ptr = message_buffer + strlen(message_buffer) - 1; while(isdigit(num_ptr) && num_ptr > message_buffer) --num_ptr; int number = atoi(num_ptr); if(number > UINT16_RANGE) //Handle error here return number; } uint16_t get_uint16(NetworkMessage *message) { uint16_t ret = 0; if (!message || !message->buffer) return 0; ret = get_number(message->buffer); //message->position += sizeof(uint16_t); return ret; } 

Tu código no hace lo que crees que hace. No puedes convertir el texto en un número y esperar que descubra qué números deseas.

Una cadena es una matriz de caracteres, cada uno de los cuales tiene un valor ASCII. Al convertir a (int*) , toma el valor ASCII de los primeros 4 caracteres (4 bytes a un int) y crea un gran número de ellos.

En su ejemplo, los valores ASCII de los primeros 4 caracteres son { 0x68, 0x65, 0x6c, 0x6c } . Ahora invierte el orden de los sistemas { 0x6c, 0x6c, 0x65, 0x68 } a { 0x6c, 0x6c, 0x65, 0x68 } . 0x6c6c6568 estos en 0x6c6c6568 . Convertir eso a decimal es 1,819,043,176 . Cuál es el número que obtienes en tu salida.

Si solo quieres el 123, tienes que usar un análisis inteligente de la cadena para analizar el hello y luego usar atoi() en el rest.

Necesitas usar atoi(s) .

En su código, está lanzando un puntero de cadena a un puntero de entero, leyendo los primeros cuatro bytes de una cadena como un entero grande. int atoi(char*) realizará un análisis correcto y devolverá un valor entero.

Al analizar “hello123”, se detendrá en el primer carácter no numérico y devolverá 0. Puede omitir caracteres no numéricos, probando con int isdigit(char) :

 int atoi_skip(char *s) { while(*s != '\0' && !isdigit(*s)) s++; /* skip non digits */ return atoi(s); } 

Todos los demás tienen toda la razón. No puede convertir una matriz de caracteres en un entero utilizando una conversión. No funciona de esa manera. En C, los caracteres están representados por números enteros. Cuando escribes:

 char *s = "hello123"; 

Lo que estás obteniendo es una matriz con un montón de caracteres en ella. Podrías escribir de manera equivalente:

 char *s = {'h', 'e', 'l', 'l', 'o', '1', '2', '3', '\0'}; 

Por lo tanto, cuando llama a printf("%d\n",*(int *)s); , lo que estás haciendo es convertir la dirección de memoria de tu matriz de caracteres en un puntero a un entero. Entonces estás tomando el contenido de este entero e imprimiéndolo. Estoy bastante seguro de que el resultado que obtendrás dependerá del sistema que uses, pero definitivamente no es lo que quieres.

Lo que probablemente quieras hacer es esto:

 printf("%d\n", atoi(&(s[5]));