【问题标题】:String function returns strange value字符串函数返回奇怪的值
【发布时间】:2018-10-08 14:54:14
【问题描述】:

我有一个函数返回一个字节的二进制表示:

std::string ToBinary(unsigned char &Num)
{
    char str[8];
    char Symb = 0;
    int i = 0;
    while (i<8)
    {
        _asm
        {
            //push al
            shr byte[Num], 1
            mov al, 0
            adc al, 30h
            mov byte[Symb], al
            //pop al
        }
        str[7-i] = Symb;
        i++;
    }
    return std::string(str);
}

它的调用:

std::string BinOut = ToBinary(ByteValue);

问题在于,它返回的不是 8 字符字符串,而是 14 字符字符串。显然,函数 str 内部显示了正确的值。如何让它返回 8 个字符?

【问题讨论】:

标签: c++ string


【解决方案1】:

std::string 的构造函数接受指向char 的指针,要求指向的字符串以空值结尾。您的 str 不是以 null 结尾的,因此程序的行为是未定义的。

你可以

  • 使用char[9] 并将最后一个字符设置为'\0'。这仅在 str 不包含任何零字节时才有效,因为第一个字节将是终止符。
  • 或者使用没有这个要求的构造函数std::string(char *s, std::size_t count)

【讨论】:

  • 也可以保留char str[8];,然后使用return {std::begin(str), std::end(str)};列出初始化返回的字符串。
【解决方案2】:

问题是因为您的字符数组不包含终止空字符。一种解决方案是分配一个带有一个额外字符的数组,以便您可以用 null 终止它:

char str[9]
//...
str[8] = '\0'

或者,您可以使用重载的字符串构造函数,该构造函数允许您从输入数组中传入要使用的字符数的参数:

std::string(str, 8);

【讨论】:

  • 这太过分了。只需使用另一个重载std::string。在一般情况下它也不会正常工作(序列中会有空字节!)
  • @SergeyA 是的,我假设前面的代码正确构建了 8 个非空字符的数组。
猜你喜欢
  • 2013-12-29
  • 2016-10-11
  • 2014-02-28
  • 2012-06-21
  • 2014-08-11
  • 2019-11-14
  • 2019-05-29
  • 1970-01-01
  • 2019-07-05
相关资源
最近更新 更多