一、具体代码
#include <stdio.h>
#include <string.h>
void main()
{
char a[50],t;
int i,slength;
printf("输入需转换的字符串:\n");
scanf("%s",a);
slength=strlen(a);
for(i=0;i<=slength/2;i++)
{
t=a[i];
a[i]=a[slength-1];
a[slength-1]=t;
slength--;
}
printf("转化后的字符串为:\n");
printf("%s",a);
}
二、代码分析
以ABCD为例子,
具体代码的写法,是根据交换来达到反序的目的。
scanf("%s",a); <=============> gets(a)
printf("%s",a); <=============> puts(a)
这两条语句等价代换,gets(a)函数的功能是从输入缓冲区中读取一个字符串存储到字符指针变量 a 所指向的内存空间,是专属字符串的输入函数,与之相对的输出函数是puts(a) ( a 只代表此代码中数组所定义的数组名,可更改)。
slength=strlen(a);
for(i=0;i<=slength/2;i++)
通过用strlen()函数来计算数组的长度(即输入的字符串长度),用slength变量存储;
通过头尾交换(图例所示),由案例实现也可看出来交换后的结果,每个元素位置与之前的位置以slength/2对称,同时也减少了比较的次数
a[i]=a[slength-1];
t为中间变量存储,slength-1为元素末尾数组下标,例:a[4]的元素下标应该分别为0、1、2、3;
三、案例实现
四、其他思路
1、数组存储
除了通过交换,还可以通过数组存储来实现,存储方式为字符,
a:具体代码
#include <stdio.h>
void main()
{
int i=0,j;
char a[100];
printf("输入需转换的字符串:\n");
for(i=0;i<100;i++)
{
scanf("%c",&a[i]);
if(a[i]=='\n')
{
break;
}
}
printf("转化后的字符串为:\n");
for(j=i-1;j>=0;j--)
{
printf("%c",a[j]);
}
}
案例中是直接倒序输出,也可以通过创建新的数组,将a[ ]数组中的元素倒序存储到新的数组中,再输出新的数组也可以达到反序的目的。
b:案例实现
2、指针交换
a:具体代码
#include <stdio.h>
#include <string.h>
void reverse(char *str)
{
char *end = str;
char *start = str;
char mid;
/*使指针end指向数组最后一个下标*/
while(*end)
{
++end;
}
--end;
while(start < end)
{
mid = *start;
*start++ = *end;
*end-- = mid;
}
}
int main()
{
char a[]="I love you Baby!";
printf("输入的字符串为:\n");
puts(a);
reverse(a);
printf("反转后的字符串为:\n");
puts(a);
return 0;
}
关于end指针指向最后一个元素第二种写法:
int length = strlen(str);
char *end = str + length - 1;
以ABCD为例,图示解释指针如何移动: