字符串反序操作,可以分为两种类型,一种是将字符串的反序存储,一种是将字符串反序输出。
对于前一种,假设字符串长度为n,可以从第1个字符到第floor(n/2) (取整函数,取得不超过某个数的最大整数)个字符,依次将第i个字符和第n+1-i个字符交换位置。这一结束后,字符串就反序存储了。
对于后一种,可以采取两种方法。第一种方法是从字符串的最后一个字符逆序遍历到第一个字符,依次打印每个字符。第二种方法是采用递归方法,这里先不做解释,稍后会在具体例子中说明。采用前一种方法简单直观,后一种方法则更加巧妙。
下面来看一个C语言编写的具体例子。
对于前一种,假设字符串长度为n,可以从第1个字符到第floor(n/2) (取整函数,取得不超过某个数的最大整数)个字符,依次将第i个字符和第n+1-i个字符交换位置。这一结束后,字符串就反序存储了。
对于后一种,可以采取两种方法。第一种方法是从字符串的最后一个字符逆序遍历到第一个字符,依次打印每个字符。第二种方法是采用递归方法,这里先不做解释,稍后会在具体例子中说明。采用前一种方法简单直观,后一种方法则更加巧妙。
下面来看一个C语言编写的具体例子。
#include <stdio.h>
#include <string.h>
void inversePrint(const char * const);//将字符串反序打印
void invert(char * const);//将字符串反转存储
int main()
{
char str[15]="I love China";
//将原字符串反序存储
invert(str);
printf("反序后的字符数组为:\n%s\n", str);
//将原字符串反序输出
printf("反序打印的结果为:\n");
inversePrint(str);
return 0;
}
void invert(char * const str)
{
int n = strlen(str);
int m = n / 2 - 1;//计算中间值的序号
int i = 0;
char ch;
for(i = 0; i <= m; i++)
{
//交换对称的数组元素
ch = str[i];
str[i] = str[n-1-i];
str[n-1-i] = ch;
}
}
//采用递归方法反序输出字符串
void inversePrint(const char * const str)//传入参数为字符数组的起始地址
{
if(*str == '\0')
{
return;//遇到结束符,结束递归,返回上一层
}
else
{
inversePrint(str + 1);//将以下一个字符为起始元素的子数组的首地址作为实参再次调用
/*输出单个字符,这是当递归到字符串结束符后开始执行的,执行完成再返回上一层,直到
返回到第一层,输出首个字符*/
putchar(*str);
}
}
运行结果为:
反序后的字符数组为:
anihC evol I
反序打印的结果为:
I love China