gpt4 book ai didi

c - 使用 memcpy 和 strtoul 获取乱码而不是数字

转载 作者:太空宇宙 更新时间:2023-11-04 05:29:34 25 4
gpt4 key购买 nike

我在 gcc 下编译了以下代码:

int parseMsg(const char *msg_to_parse, unsigned long *exp_input, unsigned long *sysTicks )
{
int l_msg_size = strlen(msg_to_parse);
if(l_msg_size <10)
return -1;
char l_exp_input_arr[10];
char l_sys_ticks_arr[10];
memcpy(l_sys_ticks_arr,msg_to_parse+12,10);

memcpy(l_exp_input_arr,msg_to_parse,10);
//l_msg_size = strlen(msg_to_parse);
*sysTicks = strtoul(l_sys_ticks_arr,NULL,10);

*exp_input = strtoul(l_exp_input_arr,NULL,10);



return 0;
}

我正在尝试以下列方式对其进行测试:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int parseMsg(const char *msg_to_parse, unsigned long *exp_input, unsigned long *sysTicks );

int main(void) {
char msg[] = "1234567890 59876543213";
unsigned long along1, along2;
along1 =0;
along2=0;
parseMsg(msg,&along1, &along2 );
printf("result of parsing: \n \t Along 1 is %lu \n \t Along 2 is %lu \n",along1, along2);
return 0;
}

但是,我得到以下结果:

解析结果: 沿着 1 是 1234567890 沿着2是4294967295

为什么第二个unsigned long不对?

谢谢

最佳答案

您提供的第二个整数太大,无法在您的体系结构的内存中表示。因此,根据它的 API,strtoul 只是返回给您 ULONG_MAX(在您的架构上 = 4294967295),同时将 errno 设置为 ERANGE/p>

strtoul API 在这里:http://www.cplusplus.com/reference/clibrary/cstdlib/strtoul/

但是 如果您提供一个较小的整数,它也可能会失败,因为 strtoul 只有在遇到非数字字符时才会停止解析。由于您没有确保这一点,因此您不能确定 strtoul 不会尝试解析字符串之后内存中的任何内容。 (所以假设是随机的,256 次中有 10 次机会出现转换错误)

用\0 结束你的字符串,这样就可以了:

char l_exp_input_arr[11]; // +1 for \0
char l_sys_ticks_arr[11];

memcpy(l_sys_ticks_arr, msg_to_parse+12, 10);
l_sys_ticks_arr[10] = '\0';

memcpy(l_exp_input_arr, msg_to_parse, 10);
l_exp_input_arr[10] = '\0';

关于c - 使用 memcpy 和 strtoul 获取乱码而不是数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11189828/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com