#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 ++方面不是很好,所以如果我的问题没有达到标记,请原谅我。
答案 0 :(得分:7)
您没有为字符串分配内存。 gets
不为您分配内存,因此您只是在读取某个随机位置 - 结果未定义。
除此之外,还有更多问题:
string
会是一个更好的主意)gets
代替fgets
。 gets
非常危险,应该避免。答案 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);