当我在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/

10-12 20:22