【问题标题】:Cant Split and Store hexstring in array无法在数组中拆分和存储十六进制字符串
【发布时间】:2016-11-09 09:13:42
【问题描述】:

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

我打算拆分这个字符串

27CA6B

 27
 CA
 6B

但输出总是只有第一个字符串。 喜欢

27
51819
0

请有人帮忙,这是我的代码

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

【问题讨论】:

  • 注意:CA6B 以十六进制形式整体有效。
  • 是的,它是十进制的整个 CA6B,但我希望它像我的意图那样分开
  • 具体要求是什么?您的第一段看起来您想将一个 6 个字符的字符串拆分为 3 个字符串,每个字符串有两个字符,但是您的代码看起来您​​必须转换一个十进制数字,然后是一个十六进制数字,然后是另一个十进制数字。长度是固定的吗?没有分隔符吗?
  • 请缩进您的代码。
  • 一般目的是我想将一个包含 6 个字符的字符串拆分为 3 个字符串,每个字符串包含 2 个字符,然后我想使用 strtol 将它们转换为 int 并将 em 存储在数组中。不,没有分隔符,什么都没有。如果我的代码看起来很混乱,不要介意,我只是茫然地尝试一切来实现我的目标,因为我是 c 的新手,这就是为什么我的代码看起来很奇怪

标签: c strtol


【解决方案1】:
#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;

【讨论】:

  • 我需要将值存储在变量中,以便我可以用它做一些事情
  • @user6318361 使用数组比使用单独的变量更好。 (但是,循环可以扩展。)
  • 感谢上帝..它完美..非常感谢,你为我节省了很多时间,谢谢蓝色
【解决方案2】:

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

 resulta = strtol (theEnd, &theEnd, 16 );

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

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

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

【讨论】:

  • 我应该怎么做才能让它单独的十六进制值?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-17
  • 2020-06-15
  • 1970-01-01
  • 1970-01-01
  • 2019-07-27
  • 2020-06-11
  • 1970-01-01
相关资源
最近更新 更多