字符串函数返回奇怪的值

时间:2018-10-08 14:54:15

标签: c++ string

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

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个字符的字符串。显然,函数内部显示正确的值。如何使其返回8个字符?

2 个答案:

答案 0 :(得分:5)

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

您可以

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

答案 1 :(得分:3)

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

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

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

std :: string(str,8);