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