对于一个字符串s[x]来说,若将其从中间一分为,并前后段按顺序进行交换,最容易想到的就是用i,j两个变量,分别指向前半段与后半段的第一个元素,然后交换并同步自增,直到交换完毕;i进行循环时,i的范围是从0到L/2-1(L=strlen(s))(i的范围与L的奇偶性无关);j进行循环时,就会出现一个问题,L为奇数时,j的初始值为L/2+1,j为偶数时,j的初始值为L/2;
对于j这种情况,可以有两种解决方案
观察奇,偶两种情况可以发现,除了j的初始值,i的初始结束,j的结束都相同,所以,可以转换思路,倒着进行交换,代码如下:
#include <stdio.h>
#include <string.h>
int main(void)
{
char s[80],t;
int i,j,l;
//输入一个字符串
gets(s);
l=strlen(s);
//给i,j赋初始值
i=l/2-1;
j=l-1;
//进行循环交换
while(i>-1)
{
t=s[i];
s[i]=s[j];
s[j]=t;
--i; //因为i,j是同步的,所以i停,j也停
--j;
}
//输出字符串
puts(s);
return 0;
}
第二种方法便是将,奇偶进行统一,或者用条件判断来给j赋值
//给i,j赋初始值
i=0;
j=l/2;
if(l%2)
j=l/2+1;
//循环进行交换
while(i<l/2)
{
t=s[i];
s[i]=s[j];
s[j]=t;
i++;
j++;
}
这段代码也可以再次进行改进,赋初始值时j=(l+1)/2;