当我在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;
}
最佳答案
这是当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 ++中发现的更现代的内容,包括
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;
}
关于c++ - c++指针分配的空间比使用Visual Studio时指定的空间大,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55113405/