char tab 将 tab[0] 设置为 0

char tab is setting tab[0] to 0

我有这个代码:

#include <iostream>
#include <cstdlib>
#include <stdio.h>

int main()
{
    std::string napis = "Inhibitor";
    int length = napis.length();
    char hex[256];

    std::cout << "Original: " << napis << '\n';

    for (int i = 0; i < length; i++)
    {
        char buffer[2];
        itoa(napis[i], buffer, 16);
        hex[2*i] = buffer[0];
        hex[2*i+1] = buffer[1];
    }
    
    
    for (int i = 0; i < length * 2 + 1; i++)
    {
        std::cout << hex[i];
    }
}

在所有这些操作之后,我得到了 hex[0] == 0。真的不知道为什么。我猜我没有在任何地方设置这个值。程序应该将字符串编码为十六进制。

itoa函数将一个终止的空字符写入缓冲区。在您的代码中,它将写入 2 或 3 个字符(取决于字符串中字符的 ASCII 值),这可能会超出数组范围。

解决方案是将 buffer 的大小至少增加 1:

char buffer[4];

更好的方法是使用未弃用的名称 (_itoa),在带有字符数组的 C++ 中,它将调用函数的安全版本 (_itoa_s),该函数将检测缓冲区溢出。

避开临时缓冲区,直接写入结果缓冲区即可。

    char str[] {"abcdefg"};
    char hex[256];
    for (uint i {0}; i < sizeof(str) - 1; ++i) {
        ::sprintf (&hex[i*2], "%02X", str[i]);
    }
    std::cout << "Hex: " << hex << std::endl;