为什么字符串末尾有问号?

时间:2015-06-25 17:50:20

标签: c++ arrays string

请帮我弄清楚为什么我的字符串输出有问号。我一直在研究这个简单的反向字符串练习。我的代码可以正确完成。然后我尝试将反转的字符串存储到一个数组中,然后将此数组转换为字符串。所以这里发生了一些事情。该字符串末尾始终有一个问号。请教我原因,以及如何摆脱这个问号。这是我的代码。非常感谢你

#include <string>
using namespace std;

int main()
{
    cout<<"Please enter a string."<<endl;
    string str;
    cin >> str;
    int i=0;
    int length = str.length();
    char arr[length];
    //cout<<length;
    while (length != 0) {
        arr[i] = str.at(length-1);
        length--;
        cout<<arr[i];
        ++i;
    }
    cout<<endl;
    string stri(arr);
    cout<<endl<<stri<<endl;
    cout<<stri[4];
    return 0;
}

2 个答案:

答案 0 :(得分:3)

C(或许多其他语言)中的字符串需要由'\0'终止。毕竟,您不知道char*指向的内存有多大。所以你需要char[length + 1]。此外,variable-length arrays不是C ++的一部分。您需要使用new[]/delete[]malloc()/free()

char * arr = new char[length + 1]; // enough space for string + '\0'
char[length] = '\0';               // terminate the string with '\0'

while (length != 0) {
    // ...                         // reverse
}
cout << endl;

string stri(arr);                  // create the new string

delete[] arr;                      // don't forget to deallocate the memory

但是,如果您正在进行手动内存分配,那么您通常会遗漏标准库中的内容。事实上,您可以简单地使用right constructor(下面简化为&#39; s(4)):

template <class InputIt>
string::string(InputIt first, InputIt last);

幸运的是,std::string提供了输入迭代器,它通过std::string::rbegin()std::string::rend()向后遍历字符串。现在您的代码变得更加容易:

#include <iostream>
#include <string>

int main()
{
    std::cout << "Please enter a string." << std::endl;

    std::string str;
    std::cin >> str;

    std::cout << std::endl;

    // Create the new reversed string directly:
    std::string reversed_string(str.rbegin(), str.rend());

    std::cout << reversed_string << std::endl;

    return 0;
}

答案 1 :(得分:1)

char arr[length];

应该是

char arr[length + 1];
编辑:或者更确切地说(正如Jonathan Potter指出的那样,由于length不是编译时常量,因此您的代码可能只会编译,因为这是特定编译器允许的,例如GNU C ++):

char *arr = new char[length + 1];

(和delete [] arr;在某一点上)

存储终止&#39; \ 0&#39;:

arr[length] = '\0';