我的代码失败并返回一个非常大的数字:
#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;
}
答案 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]));