随机的ascii char出现了

时间:2012-03-20 16:06:15

标签: c++

我正在尝试编写一个程序,将消息以字符串形式向后存储到字符数组中,每当我运行它时,它有时会成功将其向后写入,但有时会将随机字符添加到最后,如下所示:

输入:向后写

sdrawkcab siht etirw

#include <iostream>
#include <string>
using namespace std;

int main()
{
 string message;
 getline(cin, message);
 int howLong = message.length() - 1;
 char reverse[howLong];
 for(int spot = 0; howLong >= 0; howLong--)
 {
   reverse[spot] = message.at(howLong);
   spot++;
 }
 cout << reverse;
 return 0;
}

4 个答案:

答案 0 :(得分:4)

缓冲区reverse的长度必须为message.length() + 1,以便它可以存储空终止字节。 (并且空终止字节需要放在该缓冲区的最后一个位置。)

答案 1 :(得分:2)

由于您无法声明一个长度仅在运行时已知的数组,因此您必须使用容器。

std::vector<char> reverse(message.length());

或者更好,请使用std::string。 STL还为您提供了一些不错的功能,例如在构造函数调用中构建反向字符串:

std::string reverse(message.rbegin(), message.rend();

答案 2 :(得分:1)

您应该构建一个新字符串,而不是反转到字符缓冲区。它更容易,也不容易出错。

 string reverse;
 for(howlong; howLong >= 0; howLong--)
 {
   reverse.push_back(message.at(howLong));
 }

答案 3 :(得分:1)

使用适当的C ++解决方案。

内联反转消息:

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

int main() {
    string message;
    getline(cin, message);

    //inline reverse the message
    reverse(message.begin(),message.end());

    //print the reversed message:
    cout << message << endl;
    return 0;
}

撤消消息字符串的副本:

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

int main() {
    string message, reversed_message;
    getline(cin, message);

    //reverse message
    reversed_message = message;
    reverse(reversed_message.begin(), reversed_message.end());

    //print the reversed message:
    cout << reversed_message << endl;
    return 0;
}

如果你真的需要在C字符串中保存反转的字符串,你可以这样做:

char *msg = (char *)message.c_str();

但是,根据经验,如果可以,请使用C ++ STL字符串。