[英]Converting from char* to int
我的代码失败并返回一个非常大的数字:
#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;
}
您的代码没有按照您的想法执行。 您无法将文本转换为数字,并希望它能够找出您想要的数字。
字符串是一个字符数组,每个字符都有一个ASCII值。 通过转换为(int*)
,它获取前4个字符的ASCII值(4个字节为int)并从中创建一个巨大的数字。
在您的示例中,前4个字符的ASCII值为{ 0x68, 0x65, 0x6c, 0x6c }
。 现在,您将小端系统的顺序反转为{ 0x6c, 0x6c, 0x65, 0x68 }
。 您将这些组合成0x6c6c6568
。 将其转换为十进制是1,819,043,176
。 您输出的数字是多少。
如果你只是想要123你必须使用聪明的字符串解析来解析hello
,然后在剩下的上使用atoi()
。
这假设你的字符串有两个部分,第一个持有字符的indeces(例如hello
)和持有数字的最后一个indeces(例如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;
}
你需要使用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);
}
其他人都是对的。 您不能使用强制转换将字符数组转换为整数。 它不起作用。 在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]));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.