用零填充字符串后 - 它会打印未指定的字符? (C ++)

时间:2015-06-24 12:36:19

标签: c++ pointers

基本上,在这里,我试图反转数组,并将反转的int数组转换为字符串(我试图在C ++中编写相当于Java的BigInteger类 - 基本上将输入转换为大端排序,分解操作,将结果反转回小端格式,并返回字符串)。

正如你在下面看到的那样,它会输出一些奇怪的字符(我认为这是一个超出范围的参考?) - 但我不完全确定是什么导致了这个输出?

如果你能看一下,我真的很感激:

示例输入

int a[] = {1, 2, 3};
int rA[3];

reverseIntArray(a, rA, 3);
string aString = intArrayToString(a, 3);

cout << aString << endl;

控制台输出

123\216\377

如您所见 - 它正确计算答案,但\277_\377除外。

我将发布其余的相关功能:

reverseIntArray

void reverseIntArray(int array[], int reversedArray[], int arrayLength) {
    for (int i = 0; i < arrayLength; i++) {
        reversedArray[i] = array[arrayLength - 1 - i];
    }
}

intArrayToString

string intArrayToString(int digits[], int length) {
    //  convert int array to char array
    char digitsChar[length];


    for (int i = 0; i < length; i++) {
        digitsChar[i] = '0' + digits[i];
    }

    //  convert char array to string
    string intString(digitsChar);

    return intString;
}

我很确定这是一个与指针有关的微妙问题,但我仍然相对较新的C ++(从Java迁移)并且我已经盯着这几个小时但是避风港&# 39;想出任何想法。

1 个答案:

答案 0 :(得分:2)

您正在使用的std::string constructor假设您传递的字符串已正确终止,而不是std::string构造函数导致未定义的行为超出digitsChar数组的末尾。

三种可能的解决方案:

  1. digitsChar数组中的另一个字符腾出空间并终止它:

    char digitsChar[size + 1];
    
    for (...) { ... }
    
    digitsChar[3] = '\0';
    
    string intString(digitsChar);
    
  2. 使用另一个传递字符数组长度的构造函数:

    string intString(digitsChar, length);
    
  3. 将字符直接附加到字符串:

    string intString;
    
    for (int i = 0; i < length; i++) {
        intString += '0' + digits[i];
    }
    
  4. 当然还有其他解决方案,例如使用std::ostringstream