从char *转换为int

时间:2011-04-05 18:17:39

标签: c

我的代码失败并返回一个非常大的数字:

#include <stdio.h>

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

用atoi它返回0,有什么想法吗?

我想要实现的目标是: 例如,我发送“hello123”到服务器软件,服务器软件应该在字符串中获得“123”数字,通过这种方法执行此操作:

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

4 个答案:

答案 0 :(得分:3)

您的代码没有按照您的想法执行。您无法将文本转换为数字,并希望它能够找出您想要的数字。

字符串是一个字符数组,每个字符都有一个ASCII值。通过强制转换为(int*),它获取前4个字符的ASCII值(4个字节为int)并从中创建一个巨大的数字。

在您的示例中,前4个字符的ASCII值为{ 0x68, 0x65, 0x6c, 0x6c }。现在,您将小端系统的顺序反转为{ 0x6c, 0x6c, 0x65, 0x68 }。您将这些组合成0x6c6c6568。将其转换为十进制是1,819,043,176。您输出的数字是多少。

如果你只是想要123,你必须使用聪明的字符串解析来解析hello,然后在余下的地方使用atoi()

答案 1 :(得分:3)

这假设你的字符串有两部分,第一个持有字符的indeces(例如hello)和持有数字的最后一个部分(例如123)。据我所知,你的意见就是你想做的事。

#include <stdio.h>  
#include <stdlib.h>

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

编辑后:试试吗?我假设message_buffer包含您的消息,且类型为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; 
} 

答案 2 :(得分:0)

您需要使用atoi(s)

在您的代码中,您将字符串指针转换为整数指针,将字符串的前四个字节读取为某个大整数。 int atoi(char*)将进行正确的解析,返回整数值。

解析“hello123”它将在第一个非数字字符上停止,并返回0.您可以跳过非数字字符,使用int isdigit(char)进行测试:

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

答案 3 :(得分:0)

其他人都是对的。您不能使用强制转换将字符数组转换为整数。它不起作用。在C中,字符由整数表示。当你写:

char *s = "hello123";

你得到的是一个包含大量字符的数组。你可以等同地写:

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

因此,当您调用printf("%d\n",*(int *)s);时,您正在做的是将字符数组的内存地址转换为指向整数的指针。然后你拿这个整数的内容并打印出来。我很确定你得到的结果将取决于你正在使用的系统,但它绝对不是你想要的。

您可能想要做的是:

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