复制字符数组并从复制的数组打印十六进制会出现错误

标签 c

我正在尝试一个基本程序将元素从一个数组复制到另一个数组。源数组有更多元素。将元素从源复制到目标时,我只复制源数组中的少数元素。

我的源数组包含一些十六进制值。

当我以十六进制形式打印目标数组时,最后一个元素是不同的。即元素在不知不觉中相加 ffffff

这是示例程序

void String_Copy(char *src, char *dest, int length)
{
    for (int i=0; i<length; i++)
    {
        dest[i] = src[i];
    }
}

int main(void)
{
    char firstStr[] = {0x01,0x03,0x02,0x13,0x88,0xB5,0x12};
    char secStr[5];

    String_Copy(firstStr,secStr,5);

    for (int i=0;i<5;i++)
    {
        printf("%02x ",secStr[i]);
    }

}

这里我只想复制五个元素并打印输出。

Expected Output: 01 03 02 13 88

Getting Output: 01 03 02 13 ffffff88

这些在哪里ffffff来自???

enter image description here

幕后发生了什么??????

提前致谢

最佳答案

您看到的是符号扩展的结果。您的平台显然有一个签名 char类型,因此您已经在初始化中具有实现定义的行为:

char firstStr[] = {0x01,0x03,0x02,0x13,0x88,0xB5,0x12};

0x88无法在您的 char 中表示输入,最大值可能是 0x7f 。如果类型不能表示值,则转换为有符号类型的结果是实现定义的。在你的情况下,它会导致一些负数。

现在,你对printf()的论点受整数提升规则的约束,它被转换为 int 。对于负数,这意味着添加 1位在额外的位置,这就是为什么你会看到一堆 0xf尝试将其打印为无符号时的十六进制数字。顺便说一句,这也没有明确定义,%x预计 unsigned ,但你给它一个有符号的值。

最简单的解决方案就是使用 unsigned char到处。另外,将格式字符串更改为 %02hhx告诉printf()它只是一个无符号的char,而不是一个无符号的int

关于复制字符数组并从复制的数组打印十六进制会出现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51588781/

相关文章:

c - C 中的枚举和字符串

c - 上面的 C 代码有效吗?

C-gethostbyaddr & Valgrind

c - 如何使用指针数组?

c - char指针的内存分配

c - 找出C中的整数比较

c - 什么是弱函数,它们的用途是什么?我正在使用 stm32f429 微 Controller

c - 使用 uname(2) 检查错误?

c - 使用泰勒展开的正弦函数(C 编程)

c++ - 操作系统提供的抽象