1. 要求
- 编写一个函数reverse_str(char* str), 反向输出一个数组,比如("abcd"-->"dcba");
- 不能使用C函数库中的字符串操作函数;
- 最好使用递归法;
2. 代码
2.1 递归法
#define _CRT_SECURE_NO_WARNINGS 1
#pragma warning(disable:6031)
#include <stdio.h>
int my_strlen(char* str)
{
if (*str != '\0')
return 1 + my_strlen(str + 1);
else
return 0;
}
void reverse_str(char* str)
{
int len = my_strlen(str) - 1; //求出字符串右下标;
char tmp = *str; //1.临时存放首字符;
*str = *(str + len); //2.末字符移到首字符位置;
*(str + len) = '\0'; //3.末字符位置先用'\0'作为新字符串的终止符号;
if (my_strlen(str + 1) > 1) //假设撸去首末字符后的字符串长度为0或者1,那么不需要再换了
{
reverse_str(str + 1); //4.递归撸去首末字符后新的字符串;
}
*(str + len) = tmp; //5.此时再把临时存放的首字符扔回末字符的位置;
}
int main()
{
char arr[10] = { 0 };
printf("请输入英文字符串>:");
scanf("%s", arr);
reverse_str(arr);
printf("%s\n", arr);
return 0;
}
2.2 迭代法--定义reverse_str(char * str)函
void reverse_str(char* str)
{
int left = 0;
int right = my_strlen(str) - 1;
while (left < right)
{
char tmp = str[left];
str[left] = str[right];
str[right] = tmp;
left++;
right--;
//此处也可以用指针来实现位置调换
/*char tmp = *(str + left);
*(str + left) = *(str + right);
*(str + right) = tmp;
left++;
right--;*/
}
}
2.3 不按照要求的暴力输出方
#define _CRT_SECURE_NO_WARNINGS 1
#pragma warning(disable:6031)
#include <stdio.h>
#include <string.h>
int main()
{
char arr[20] = { 0 };
printf("请输入英文字符串>:");
scanf("%s", arr);
int i = strlen(arr) - 1;
int j = 0;
for (j = i; j >= 0; j--)
printf("%c", arr[j]);
return 0;
}
2.4 拓展(上面的代码都是要求输入英文字符串,那么如果我想输入中文呢,如何倒序输出?目标是:input"我爱你"-->output"你爱我")
#define _CRT_SECURE_NO_WARNINGS 1
#pragma warning(disable:6031)
#include <stdio.h>
#include <string.h>
int main()
{
char arr[20] = { 0 };
printf("请输入中文字符串>:");
scanf("%s", arr);
int i = strlen(arr) - 1;
int j = 0;
for (j = i; j >= 1; j -= 2)
printf("%c%c", arr[j-1], arr[j]);
//此处如果先打印arr[j], 会出现bug; (j-1)+j = 一个汉字
return 0;
}
当然,这时候可能会有一些调皮的孩子会说,如果我input"我爱你!"呢?能output"!你爱我"吗?只要你的感叹号是中文状态输入的就行,如果你真的皮到用英文感叹号,那么系统会很讨厌你,并给你个大写的BUG
2.5 小小补
#define _CRT_SECURE_NO_WARNINGS 1
#pragma warning(disable:6031)
#include <stdio.h>
#include <string.h>
//Author: wanlin_z
//1. 单个英文字符(字母和符号)和阿拉伯数字统一占1个字节;
//2. 通常情况下,一个中文字符,占2个字节;
//3. 特殊情况,中文省略号占4字节,& *中英均只占1字节;
int main()
{
char arr[] = "【[";
int len = strlen(arr);
printf("%d\n", len);
return 0;
}
3. 总结
罗马只有一个,道路却有千千万,所以,不要限制你的思维啦。同时也期待各位大佬不吝赐教(点评,讨论, 指正错误...),带我打开格局