当我在Visual Studio中运行此代码时,最后得到一堆垃圾字符,但是当我在在线编译器中运行它时,我得到了我想要的确切字符?(“ olleH”)。请保持温柔,我是菜鸟。
#include<iostream>
#include<string>
int main() {
std::string stringOne{ "Hello" };
int stringLength = stringOne.length();
char* stringTwo = new char[stringLength];
for (int i = 0; i < stringLength; ++i) {
*(stringTwo + i) = stringOne[stringLength - i - 1];
}
std::string stringThree = stringTwo;
std::cout << stringThree << std::endl;
}
答案 0 :(得分:3)
当char* stringTwo = new char[stringLength];
为5(如此处所示)时,使用stringLength
语句可以得到以下内容:
_____stringTwo_____
/ \
+---+---+---+---+---+------------------+
| ? | ? | ? | ? | ? | <arbitrary data> |
+---+---+---+---+---+------------------+
然后,您的循环将按如下所示填充它:
_____stringTwo_____
/ \
+---+---+---+---+---+------------------+
| o | l | l | e | H | <arbitrary data> |
+---+---+---+---+---+------------------+
然后将您视为C样式的字符串,尽管该字符串上没有空终止符。这意味着字符串函数将读取数据末尾的 并处理其中存在的所有内容。您应该做的是构造一个真正的C样式字符串,终止符和所有内容:
char *stringTwo = new char[stringLength+1];
for (int i = 0; i < stringLength; ++i)
*(stringTwo + i) = stringOne[stringLength - i - 1]; // or: stringTwo[i]
*(stringTwo + stringLength) = '\0'; // stringTwo[stringLength]
那会给你更正确的提示:
_______stringTwo________
/ \
+---+---+---+---+---+----+-----------------+
| o | l | l | e | H | \0 |<arbitrary data> |
+---+---+---+---+---+----+-----------------+
当然,在C ++中使用C样式字符串几乎是教科书中定义的一个坏主意,仅适用于非常罕见的情况。
除非您想被称为C +开发人员(从来没有完全退出过C ++开发的那种奇怪的C开发人员),否则您应该拥抱C ++中的更现代的东西,< em>包括 std::string
和<algorithms>
中的内容(如果您需要做点事情而不是在教育背景下学习底层编程):
#include <iostream>
#include <string>
#include <algorithm>
int main() {
std::string str("Hello");
std::reverse<std::string::iterator>(str.begin(), str.end());
std::cout << str << std::endl;
}
答案 1 :(得分:-1)
std:string is not null terminated string.
#include<iostream>
#include<string>
int main() {
std::string stringOne{ "Hello" };
int stringLength = stringOne.length();
char* stringTwo = new char[stringLength+1]; // allocate one byte extra to store null character
for (int i = 0; i < stringLength; ++i) {
*(stringTwo + i) = stringOne[stringLength - i - 1];
}
*(stringTwo + stringLength) = '\0'; // add null character
std::string stringThree = stringTwo;
std::cout << stringThree << std::endl;
}