【问题标题】:char tab is setting tab[0] to 0char 选项卡将选项卡 [0] 设置为 0
【发布时间】:2021-03-18 08:16:13
【问题描述】:

我有这个代码:

#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。不知道为什么。我没有在任何地方设置这个值。程序应该将字符串编码为十六进制。

【问题讨论】:

  • 将字符串编码为十六进制是什么意思?十六进制的 ASCII 值?
  • 是的,不知道怎么形容;/
  • 您的 itoa() 调用有缓冲区溢出,因为它将输出 2 个十六进制数字和一个空终止符,但您的 buffer[] 太小了。您根本不需要itoa(),您可以直接对napis 字符使用简单的数学运算生成hex 字符串。此外,您的 hex 字符串不是以 null 结尾的。
  • omg 没错,在将缓冲区 [2] 更改为缓冲区 [3] 后它可以工作,我认为 itoa() 将空终止符作为值返回,而不是作为缓冲区 [] 的一部分,谢谢非常。我知道它可以在很多方面做得更好。 Rn 这只是我在玩,所以我可以设置一切,我肯定会改变很多正在进行的事情。
  • 您对hex[0] 的期望是什么。 (假设您可能不知道如何准确描述您的目标,因此在这种情况下您可能必须明确说明预期结果。)

标签: c++ arrays string char hex


【解决方案1】:

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

解决办法是将buffer的大小至少增加1:

char buffer[4];

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

【讨论】:

    【解决方案2】:

    只是避开临时缓冲区,直接写入结果缓冲区。

        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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-24
      • 2019-04-07
      • 2011-06-08
      相关资源
      最近更新 更多