字符串的反转
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
而不是fgets
。gets
是相当危险的,应该避免使用。
您需要使用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);