/***********************************************************************
目的:非递归编写一个函数reverse_string(char* string)将参数字符串中的字符逆序打印发。如a b c d e f \0 -> f e d c b a \0 (不能使用库函数)
分析:需要定位这个字符串的左右下标,在找右下标时,因规定不能使用库函数strlen,所以my_strlen模拟实现strlen,最终循环交换即可
平台:Visual studio 2017 && windows
*************************************************************************/
实现代码:
#include<stdio.h> int my_strlen(char* str) { int count = 0; while(*str) { count++; str++; } return count; } void reverse_string(char* str) { //找到左右下标 int left = 0; int right = my_strlen(str)-1 ;//不能使用strlen库函数,所以自己造一个 //交换 while(left < right) { char temp = str[left];//同*(str+left) str[left] = str[right]; str[right] = temp; left++; right--; } } int main() { char arr[] = "abcdef"; reverse_string(arr); printf("%s\n", arr);//fedcba return 0; }
++++++++++++++++++++++++++++++++++++++++++++++++++++++
/***********************************************************************
目的:递归编写一个函数reverse_string(char* string)将参数字符串中的字符反向排列,不是逆序打印。如a b c d e f \0 -> f e d c b a \0 (不能使用库函数)
分析:两端2个字符串的交换+中间字符串的反向排列
a <-> f + b c d e
b <-> e +c d
… …
具体来说:第1步是把a存于temp;第2步是把f交换于a的位置;第3步是把原来f的位置变为\0;第4步是递归调用reverse_string来反向排列中间的元素;第5步是将temp赋值于原来f的位置
平台:Visual studio 2017 && windows
*************************************************************************/
实现代码:
#include<stdio.h> int my_strlen(char* str) { int count = 0; while(*str) { count++; str++; } return count; } void reverse_string(char* str) { char temp = *str;//1 int len = my_strlen(str); *str = *(str +len - 1);//2 *(str + len - 1) = '\0';//3 //只有2个及以上的字符时才递归 if(my_strlen(str+1) >= 2) { reverse_string(str + 1);//4 } *(str + len - 1) = temp;//5 } int main() { char arr[] = "abcdef"; reverse_string(arr); printf("%s\n", arr);//fedcba return 0; }
图解: