#反向输出一个字符串数组#

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 smile

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. 总结

罗马只有一个,道路却有千千万,所以,不要限制你的思维啦。同时也期待各位大佬不吝赐教(点评,讨论, 指正错误...),带我打开格局 smile

visual-c++·c++·c
130 views
Comments
登录后评论
Sign In
·

迭代法用 for 会更简洁一些:

void reverse_str(char* s) {
    size_t len = strlen(s);
    for (size_t i = 0; i < len / 2; ++i) {
        char temp = s[i];
        s[i] = s[len - 1 - i];
        s[len - 1 - i] = temp;
    }
}

用 VS 写 C 程序的话,你把源文件的后缀名改成 .c,用 printf 就不会报错了 joy