C 无法拆分并在数组中存储十六进制字符串

C 无法拆分并在数组中存储十六进制字符串,c,strtol,C,Strtol,我想拆分这个十六进制字符串,转换它们,并将它们存储在一个数组中。 但我的工作似乎有些不对劲,我不知道是什么 我打算把这根绳子分开 27CA6B 到 但是输出总是第一个字符串。 像 请帮帮我,这是我的密码 #include <stdio.h> #include <stdint.h> #include <stdlib.h> #include <string.h> #include <errno.h> int main(void) { c

我想拆分这个十六进制字符串,转换它们,并将它们存储在一个数组中。 但我的工作似乎有些不对劲,我不知道是什么

我打算把这根绳子分开

27CA6B

但是输出总是第一个字符串。 像

请帮帮我,这是我的密码

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

int main(void)
 {
char bc[] = "27CA6B";
char *theEnd;

long result;
long resulta;
long resultb;
long resultc;

result = strtol (bc, &theEnd, 0);
resulta = strtol (theEnd, &theEnd, 16 );
resultb = strtol (theEnd, NULL, 0);

//int i = 0;
//printf("%c%c%c%c%c%c\n", bc[0], bc[1], bc[2], bc[3], bc[4], bc[5]);

printf("%ld\n", result, &bc[0]);
printf("%ld\n", resulta, &bc[1]);
printf("%ld\n", resultb, &bc[2]);


return 0;
 }
#包括
#包括
#包括
#包括
#包括
内部主(空)
{
字符bc[]=“27CA6B”;
炭末;
长期结果;
结果长;
长期结果TB;
长期结果;
结果=strtol(bc,&theEnd,0);
结果a=strtol(theEnd,&theEnd,16);
resultb=strtol(theEnd,NULL,0);
//int i=0;
//printf(“%c%c%c%c%c%c%c\n”,bc[0],bc[1],bc[2],bc[3],bc[4],bc[5]);
printf(“%ld\n”,result,&bc[0]);
printf(“%ld\n”,resulta,&bc[1]);
printf(“%ld\n”,resultb,&bc[2]);
返回0;
}
由于这一行,您在中看到的“问题”

 resulta = strtol (theEnd, &theEnd, 16 );
在那里,
end
指向
CA6B
,根据基数16,它作为一个整体是一个有效的输入,因此整个字符串被消费和转换。十进制表示值为51819,您可以将其视为输出

实现这一点的最佳方法是(根据您的方法)获取指向数组开头的指针,并在备用索引上“剪裁”它

也就是说,您所有的
printf()
语句在逻辑上都是错误的,因为您只有一个格式说明符,但您提供了两个参数,因此最后一个参数将被默默忽略。

由于这一行,您在中看到的“问题”

 resulta = strtol (theEnd, &theEnd, 16 );
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void){
    char bc[] = "27CA6B";
    unsigned char result[(sizeof(bc)-1)/2] = {0};
    int i = 0;

    for(char *p = bc; *p; p += 2){
        char part[3] = {0};
        memcpy(part, p, 2);//Extract 2 characters
        result[i++] = strtoul(part, NULL, 16);
    }

    for(i = 0; i < sizeof(result); ++i){
        printf("%3u %c%c\n", result[i], bc[i*2], bc[i*2+1]);
    }

    return 0;
}
在那里,
end
指向
CA6B
,根据基数16,它作为一个整体是一个有效的输入,因此整个字符串被消费和转换。十进制表示值为51819,您可以将其视为输出

实现这一点的最佳方法是(根据您的方法)获取指向数组开头的指针,并在备用索引上“剪裁”它



也就是说,您所有的
printf()
语句在逻辑上都是错误的,因为您只有一个格式说明符,但您提供了两个参数,因此最后一个参数将被默默忽略。

注意:
CA6B
在十六进制中作为整体是有效的。是的,它是整个CA6B的十进制,但我希望它像我的意图一样被分开,到底要求是什么?你的第一段让人觉得你想把一个由6个字符组成的字符串分成3个字符串,每个字符串有两个字符,但是你的代码看起来好像你必须转换一个十进制数,后跟一个十六进制数,后跟另一个十进制数。长度是固定的吗?没有分隔符吗?请缩进您的代码。一般用途是我想将一个包含6个字符的字符串拆分为3个字符串,每个字符串包含2个字符,然后我想使用strtol将它们转换为int,并将它们存储在数组中。没有,没有分隔符,什么都没有。如果我的代码看起来很混乱,别介意,我只是茫然地尽一切努力实现我的目标,因为我是c语言的新手,这就是为什么我的代码看起来很奇怪的原因注:
CA6B
是十六进制的整体有效。是的,它是十进制的整个CA6B,但我希望它像我的意图一样被分开。具体要求是什么?你的第一段让人觉得你想把一个由6个字符组成的字符串分成3个字符串,每个字符串有两个字符,但是你的代码看起来好像你必须转换一个十进制数,后跟一个十六进制数,后跟另一个十进制数。长度是固定的吗?没有分隔符吗?请缩进您的代码。一般用途是我想将一个包含6个字符的字符串拆分为3个字符串,每个字符串包含2个字符,然后我想使用strtol将它们转换为int,并将它们存储在数组中。没有,没有分隔符,什么都没有。如果我的代码看起来很混乱,请不要介意,我只是茫然地尝试一切来实现我的目标,因为我是c语言新手,这就是为什么我的代码看起来很奇怪的原因。我应该怎么做才能使它成为单独的十六进制值呢?我应该怎么做才能使它成为单独的十六进制值呢?我需要将值存储在变量中,这样我就可以用它做些事情了it@user6318361使用数组比使用单独的变量要好。(不过,循环可以扩展。)感谢上帝。。太完美了。。非常感谢您,您为我节省了很多时间,感谢Blue我需要将值存储在变量中,以便我可以使用it@user6318361使用数组比使用单独的变量要好。(不过,循环可以扩展。)感谢上帝。。太完美了。。非常感谢你,你为我节省了很多时间,谢谢你
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void){
    char bc[] = "27CA6B";
    unsigned char result[(sizeof(bc)-1)/2] = {0};
    int i = 0;

    for(char *p = bc; *p; p += 2){
        char part[3] = {0};
        memcpy(part, p, 2);//Extract 2 characters
        result[i++] = strtoul(part, NULL, 16);
    }

    for(i = 0; i < sizeof(result); ++i){
        printf("%3u %c%c\n", result[i], bc[i*2], bc[i*2+1]);
    }

    return 0;
}
unsigned char result1,result2,result3;
int i = 0;
char part[3] = {0};

memcpy(part, bc + i, 2); i += 2;
result1 = strtoul(part, NULL, 16);
memcpy(part, bc + i, 2); i += 2;
result2 = strtoul(part, NULL, 16);
memcpy(part, bc + i, 2); i += 2;
result3 = strtoul(part, NULL, 16);

i = 0;
printf("%3u %c%c\n", result1, bc[i], bc[i+1]); i += 2;
printf("%3u %c%c\n", result2, bc[i], bc[i+1]); i += 2;
printf("%3u %c%c\n", result3, bc[i], bc[i+1]); i += 2;