题目:编写一个函数 reverse_string(char * string)
实现:将参数字符串中的字符反向排列,不是逆序打印。
要求:不能使用C函数库中的字符串操作函数。
比如: char arr[] = "abcdef";
逆序之后数组的内容变成:fedcba
题目分析:
字符串逆序,用循环来做很简单,只需要定义两个指针,指针left放在字符串左侧,right放在最后一个有效字符位置,再交换两个指针位置上的字符,left指针往后走,right指针往前走只要两个指针没有相遇,继续交换,两个指针相遇后,逆置结束;用递归实现就相对麻烦一点,当每次传递参数的时候只有刚开始字符串中的那一个\0,在每次递归前,必须手动加上\0,才能继续用strlen计算递归传递过去的字符串长度,这一点是很难想到的。
//循环实现
#include<stdio.h> #include<string.h> void reverse_string(char*string) { char *left = string; char *right = string+strlen(string) - 1; while (right - left > 0) { int tmp = *left; *left = *right; *right = tmp; left++; right--; } } int main() { char arr[] = "abcdef"; reverse_string(arr); puts(arr); return 0; }
代码讲解:指针right-指针left得到的是left与right之间的元素个数,那么在编程序的时候,只需要控制left与right之间有元素的时候就交换,没有元素的时候就停止循环,交换完成。strlen函数是从传递给strlen的函数参数的地址开始一直往后找,每找到一个字符,就计数加1,知道遇见字符‘\0’为止,用于求字符串长度。
//递归实现
#include<stdio.h> #include<string.h> void reverse_string(char* string) { int len = strlen(string); char tmp = *string; *string = *(string + len - 1); *(string + len - 1) = '\0'; if (strlen(string + 1) >= 2) reverse_string(string+ 1); *(string + len - 1) = tmp; } int main() { char arr[] = "abcdef"; reverse_string(arr); puts(arr); return 0; }
代码讲解:当第一次进入函数后,先将最后一个字符放在第一个字符的位置,但是不急着交换,将本该放在字符串末尾的第一个字符存起来,然后将字符串末尾置为'\0',计算从第二个字符开始,字符串的长度,如果大于1个的话,就进入递归,再重复上面的过程,递归结束后,再将存起来的字符放在交换后应该在的位置即可
总结:循环和递归还是应该尽量选择简单的,即可代码写出来,它的可读性和时间复杂度也是很重要的