//简单的指针偏移的做法
#include <stdio.h>
#include <stdlib.h>
int main()
{
char temp,*s,*s1,*s2;
s1=(char *)malloc(100);
printf("输入字符串:");
gets(s1);
s=s2=s1;
while(*s2!='\0')s2++;
s2--;
while(s1<s2)
{
temp=*s1;
*s1=*s2;
*s2=temp;
s1++;
s2--;
}
printf("逆序字符串:%s\n",s);
return 0;
}
//不申请额外的空间,不用数组,不用C库函数(I/O除外)
void reverse_string(char *ch)
{
int i=0;
while(*(ch+i)!='\0')//计算字符串长度
++i;
for(int k=0;k<i/2;k++)
{
/*a=a^b;
b=a^b;
a=a^b;*/
ch[k]=ch[k]^ch[i-k-1];//按位异或
ch[i-k-1]=ch[k]^ch[i-k-1];
ch[k]=ch[k]^ch[i-k-1];
}
}
//用递归函数实现字符串反转
char *reverse_string(char *ch)
{
if( !ch )
{
return NULL;
}
int len = strlen(ch);//计算指定的字符串的长度, 不包括结束字符\0
if( len > 1 )
{
char ctemp =ch[0];
ch[0] = ch[len-1];
ch[len-1] = '\0';// 最后一个字符在下次递归时不再处理
reverse_string(ch+1); // 递归调用,每调用一次,要反转的字符串分别从头和末尾各减少一个
ch[len-1] = ctemp;
}
return ch;
}
int main()
{
char str[100];
gets(str);//确保str的空间足够大,以便在执行读操作时不发生溢出
//scanf("%s",str);//scanf("%s",str) 函数输入字符串时存在一个问题,就是如果输入了空格会认为字符串结束,空格后的字符将作为下一个输入项处理,
//但gets()函数将接收输入的整个字符串直到遇到换行为止
//cin>>str;//如果输入了空格会认为字符串结束,空格后的字符将作为下一个输入项处理
reverse_string(str);
//printf("%s\n",str);
cout<<str<<endl;
//puts(str);//自动换行
return 0;
}