题目要求:
编写一个C程序,实现以下功能:编写一个常规的函数和一个递归函数,两个函数均能将输入的一个字符串以按反序形式的字符串作为返回值。在main函数中输入一行字符串,分别调用两个函数,输出反序后的字符串。
思路:常规思路怎么反转一个字符串呢?对于常规函数和目前已知的思想来说,冒泡排序或者是不二之选了,所以这里想提一提一种新思路:双指针
双指针:
通过定义两个指针p,q,一个指向数组的头部,一个指向数组的尾部,在循环之中不断去交换数组头部和尾部的内容,进行一次交换之后p指针向后进一,q指针向前减一。直到p,q指针相同或者p>q。
而对于递归来说要怎么处理呢?递归的思想一直是个难点,但在这题来说算是比较简单。为了得到反转的字符串,可以让数组尾部赋给一个新数组的头部,然后不断去递归这个操作即可解决。
这里说一下,是不可以用strcpy来拷贝自定义数组的,因为strcpy的函数原型只能是一个常量而不能是变量。strcpy的函数原型:char *strcpy(char *strDest, const char *strSrc);
代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define MAX 20
/*编写一个C程序,实现以下功能:
编写一个常规的函数和一个递归函数,两个函数均能将输入的一个字符串以按反序形式的字符串作为返回值。
在main函数中输入一行字符串,分别调用两个函数,输出反序后的字符串。
*/
void funcRecursion(char* str, int n) {
int i = 0;
i++;
int strTmp[MAX];
if (n == 1)
return printf("%s",str);
else {
strTmp[i] = str[n];
return funcRecursion(str, n - 1);
}
}
void func(char* str, int n) {
int p, q;
p = 0, q = n;
while (p <= q) {
char tmp = str[p];
str[p] = str[q];
str[q] = tmp;
p++; q--;
}
printf("%s", str);
}
int main() {
char str[MAX];
gets(str);
strlen(str);
func(str, strlen(str) - 1);//减一是为了减去‘\0’
printf("\n");
funcRecursion(str, strlen(str) - 1);
}