字符串的反转

reversing of a string

本文关键字:字符串      更新时间:2023-10-16
#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]!='';i++)
    {
        char temp;
        temp=b[j-i-1];
        b[j-i-1]=b[i];
        b[i]=temp;
    }
    return b;
}

这个程序没有给出编译时错误。但是它确实给出了运行时错误,并且没有给出期望的输出。请解释一下原因。由于我不太擅长c++,所以如果我的问题不符合要求,请原谅我。

没有为字符串分配内存。gets不为您分配内存,所以您只是读取到一些随机位置-结果是未定义的。

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

  • 这是标记为c++,但它更像C与cout(使用string将是一个更好的主意)
  • 您正在使用gets而不是fgetsgets是相当危险的,应该避免使用。

您需要使用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字符串那样疯狂,而且它还提供了相当简单的反向迭代。在此模型中,您不必分配自己的内存或执行自己的反转。

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

除了前面的答案之外,您实际上颠倒了两次字符串。你只需要遍历一半的字符串

查看gets()正确使用的参考。您不能传递给它一个未初始化的char*,并期望发生任何好事。你可以使用:

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