c - strcpy 复制到其他字符数组

标签 c

我正在尝试将十六进制转换为字符串,但是在使用 strcpy 然后将字符串附加到另一个变量时我遇到了一个奇怪的问题。

下面是我的代码

int hex_to_int(char c) {
int first = c / 16 - 3;
int second = c % 16;
int result = first * 10 + second;
if (result > 9) result--;
return result;
}

int hex_to_ascii(char c, char d) {
int high = hex_to_int(c) * 16;
int low = hex_to_int(d);
return high + low;
}


void hexToString(char st[16], int length, char string[16]) {
char buf = 0;
char tempHTS[16] = {""};
char tempHTS1[16] = {""};

for (int i = 0; i < length; ++i) {
    if (i % 2 != 0) {
        sprintf(tempHTS, "%c", hex_to_ascii(buf, st[i]));
        strcat(tempHTS1, tempHTS);
    } else {
        buf = st[i];
    }
}
strcpy(string,tempHTS1);
}

void decodeToHex(unsigned char readingreg[16], int length, char hexString[16]) {
char tempDTH[16];
char tempDTH1[16]={""};

for (int j = 0; j < length; ++j) {
    sprintf(tempDTH, "%x", readingreg[j]);
    strcat(tempDTH1, tempDTH);
}
strcpy(hexString,tempDTH1);
}

int main() {
unsigned char readingreg[9];
readingreg[0] = 0x74;
readingreg[1] = 0x68;
readingreg[2] = 0x69;
readingreg[3] = 0x73;
readingreg[4] = 0x20;
readingreg[5] = 0x74;
readingreg[6] = 0x65;
readingreg[7] = 0x73;
readingreg[8] = 0x74;
char hexString[16];
char actualString[16];

decodeToHex(readingreg, sizeof(readingreg), hexString);
hexToString(hexString, (int) strlen(hexString), actualString);

printf("\n%s\n", actualString);
printf("\n%s\n", hexString);

return 0;
}

下面是输出

这个测试

7468697320746573这个测试

在第二个 printf 中,“this test”自动附加到十六进制字符串。 我不明白原因。请帮忙。

提前致谢。

最佳答案

readingreg 有 9 个字节,这意味着您至少需要 9*2+1 = 19 个字符来存储该数据的十六进制字符串(每个字节 2 个, 1 表示空终止符)。 hexString 只有 16 个字节,因此您最终会越界写入,从而导致未定义的行为。

关于c - strcpy 复制到其他字符数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47101005/

相关文章:

c - 为什么函数 "everymonth"返回意外结果?

c - 我用 c 语言做了一个计算器,当我尝试运行它时会弹出错误

C 警告 : Function returns address of local variable

c - 访问由 C 中的指针引用的数组

c - 隐藏用户输入,仅允许某些字符

c - 为什么 scanf_s 在 vi​​sual studio 以外的地方不起作用?

c - 理解指向结构的指针

c - 在 C 中编译线性搜索函数时遇到问题

python - 将列表作为参数传递给 Python C 模块?

c - 需要 MSVCR120.DLL