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;
我有这个代码:
#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;