翻转一个字符串

时间:2011-07-10 11:15:26

标签: c++

#include<iostream>
#include<string.h>
using namespace std;
char * reverse (char *);
int main()
{
    char * a;
    cout<<"enter string"<<endl;
    gets(a);
    cout<<a;
    cout<<"the reverse of string is"<<reverse(a);
    return 0;
}
char * reverse (char * b)
{
    int i,j=strlen(b);
    for(i=0;b[i]!='\0';i++)
    {
        char temp;
        temp=b[j-i-1];
        b[j-i-1]=b[i];
        b[i]=temp;
    }
    return b;
}

这个程序没有给出编译时错误。但它确实给出了运行时错误并且没有给出所需的输出。请解释原因。由于我在C ++方面不是很好,所以如果我的问题没有达到标记,请原谅我。

5 个答案:

答案 0 :(得分:7)

您没有为字符串分配内存。 gets不为您分配内存,因此您只是在读取某个随机位置 - 结果未定义。

除此之外,还有更多问题:

  • 这是标记的C ++,但它更像C与Cout(使用string会是一个更好的主意)
  • 您使用gets代替fgetsgets非常危险,应该避免。

答案 1 :(得分:6)

您需要使用std::string

#include <iostream>
#include <string>
#include <algorithm>
#include <iterator>
int main()
{
    std::string a;
    std::cout<<"enter string"<<endl;
    std::cin >> a;
    std::cout << "The reverse of a string is ";
    std::copy(a.rbegin(), a.rend(), std::ostream_iterator<char>(cout));
    return 0;
}

标准提供的字符串处理并不像您尝试使用的C字符串那样疯狂,并且它还提供了非常简单的反向迭代。在此模型中,您不必分配自己的内存或进行自己的反转。

答案 2 :(得分:2)

你需要为第一个字符串分配空间,否则你指向以太并覆盖上帝只知道什么空间。但是,为了更加惯用C ++,我建议您使用标准字符串吗?只需用std :: string替换char *。

答案 3 :(得分:2)

除了之前的答案,你实际上是在两次翻转你的字符串。你必须只走一半的弦。

答案 4 :(得分:1)

检查reference是否正确使用gets()。你无法将它传递给未初始化的char*并期待任何好事发生。你可能会有更好的运气:

char a[256];
cout<<"enter string"<<endl;
gets(a);