c语言字符串逆序总结与辨析

  • 内容介绍
  • 库函数strrev逆序字符串
  • 指针,数组逆序打印字符串,不改变字符串的内容
  • 自定义函数reverse_string(char *string)逆序字符串
  • 函数递归实现字符串逆序
  • 字符串倒置经典笔试题解析

内容介绍

这篇博文来源于我做c语言的相关习题时,遇到的一些有关字符串的的知识的相关总结,下面的内容既有相同又有不同,有时稍不留神就可能混淆,需要我们细细品味,博文内容难度由低到高,既涉及知识知识多样化。

库函数strrev逆序字符串

这是c语言库为我们提供的函数,只要查看相关手册就能轻松使用,是最简单的字符串逆序函数了

这里是引用MSDN里的解释
头文件:#include
strrev()函数将字符串逆置,其原型为: char *strrev(char *str);
【参数说明】str为要逆置的字符串。

strrev()将str所指的字符串逆置。
【返回值】返回指向逆置后的字符串的指针。

strrev()不会生成新字符串,而是修改原有字符串。因此它只能逆置字符数组,而不能逆置字符串指针指向的字符串,因为字符串指针指向的是字符串常量,常量不能被修改。

【函数示例】

#include
#include
int main()
{
     
	char str1[] = "hello";
	char *ret1 = strrev(str1);
	printf("%s\n", ret1);
	return 0;
}

ps:在应用该库函数的时候还会遇到如下的报错,类似如下报错,解决方法是一样的。
在这里插入图片描述
解决办法:打开 项目属性 -> c/c++ -> 预处理器 -> 预处理器定义 -> 编辑
输入如下两句,保存编辑确定即可。

_CRT_NONSTDC_NO_DEPRECATE
_CRT_SECURE_NO_WARNINGS

指针,数组逆序打印字符串,不改变字符串的内容

我们首先定义了一个字符数组,每个数组元素都有它的地址,通过自定义函数reverse一个一个字符的向后找,直到找到最后一个元素的地址。再通过循环的方式,从最后一个数组的地址倒着打印字符串到开始的字符。数组的方式也是一样找到最后一个元素的下标,逆着打印就行。
【指针逆序】


#define _CRT_SECURE_NO_WARNINGS
#include 
void reverse(char *p)//定义一个指针来接收
{
     
	char *tem = p;
	while (*p != '\0')
	{
     
		p++;
	}
	while (tem <= p)
	{
     
		printf("%c", *(p - 1));
		p--;

	}
}
int main()
{
     
	char arr[20] = "0";
	printf("请输入一串字符串,中间可以有空格\n");
	gets(arr);//用gets来接收这个字符数组,gets可以接收空格;而scanf遇到空格,回车和Tab键都会默认为输入结束,所以它不能接收空格
	reverse(arr);//函数传参,传过去数组名,相当于数组首元素的地址
}

【数组逆序】

#define _CRT_SECURE_NO_WARNINGS
#include 
#include 
void reverse(char* arr)//
{
     
	int i = 0;
	int  z = strlen(arr)-1;//数组下标从0开始,找到最后一个元素的下标
	for (i = z; i >= 0; i--)
	{
     

		printf("%c", arr[i]);

	}

}
int main()
{
     
	char arr[20] = "0";
	printf("请输入一串字符串,中间可以有空格\n");
	gets(arr);
	reverse(arr);//函数传参,传过去数组名,相当于数组首元素的地址
}


自定义函数reverse_string(char *string)逆序字符串

**这里的函数首先是交换改变数组的内容之后再打印,简单的就是第一个字符和最后一个交换,第二个和倒数第二个字符交换,就是两两交换,交换完了之后左边字符向右移,右边字符向左移,直到左边字符的下标或者地址大于或者等于右边字符的下标或者地址为止,那时停止交换。**这里还涉及一个求字符串长度的函数,如果你做练习要求不能使用c函数库中的字符串操作函数strlen,那就自定义一个求字符串的函数my_strlen,对于这个函数的实现是,**字符串的结束标志是‘\0’,**从字符串的起始位置找不是‘\0’,计数器就加一,之后寻找的位置后移一个地址,继续如此寻找直到找到‘\0’结束寻找。

#define _CRT_SECURE_NO_WARNINGS
#include
int my_strlen(char* str)//求字符串的自定义函数
{
     
	int count = 0;//计数器count
	while (*str != '\0')
	{
     
		count++;
		str++;
	}

	return count;
}

void reverse_string(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--;
	}
}
//
//void reverse_string(char* str)
//{
     
//	int left = 0;
//	int right = my_strlen(str) - 1;
//指针形式
//	while (left < right)
//	{
     
//		char tmp = *(str + left);//指针加整数是移向下一个地址。如+1是向后移动一个地址
//		*(str + left) = *(str+right);
//		*(str+right) = tmp;
//		left++;
//		right--;
//	}
//}
int main()
{
     
	char arr[] = "abcdef";
	reverse_string(arr);//数组名arr是数组arr首元素的地址

	printf("%s\n", arr);//fedcba
	return 0;
}

函数递归实现字符串逆序

函数递归的思想简单的就是是大事化小,分而治之,把一件大事分为具有相同特点的小事,一直把小事分到某一个结束时刻(函数递归的限制条件满足),小事做好了大事也就做好了。这里具有相同特征的小事为:逆序一个字符串把前后两个字符串交换中间逆序。我想这个问题就是这样的,逆序一个字符串交换前后两个字符的位置,逆序中间的字符,逆序中间的字符又可看作是一次函数调用,即交换前后两个字符串逆序中间的元素;一直函数调用函数到需要逆序的字符串长度小于二(即为1或者0这时就不需要交换了)
字符串的逆序的5个步骤如下步骤

  1. 创建一个字符变量来存拿下来的字符串首元素
  2. 把最后一个字符拿到字符串的首元素位置
  3. 在最后一个字符串拿完字符的位置,放上一个‘\0’,形成下一次函数递归
  4. 满足条件,开始下一次字符串的逆序(调用字符串逆序函数)
  5. 下面简单的画图演示下过程:
    c语言字符串逆序总结与辨析_第1张图片
    我们调用reverse_string函数传上来整个数组如图一,字符串的结束标志是\0,之后开始逆序字符串,该递归的关键在于第三步把e字符的位置放上\0,之后启动第二次逆序(递归),第二次逆序函数的内容才是一个字符串,如图二,之后继续执行。逆序完后,字符串个数为一,结束递归
void reverse_string(char* str)
{
     
	char tmp = *str;//步骤1
	int len = my_strlen(str);//
	*str = *(str + len - 1);//步骤2
	*(str + len - 1) = '\0';//步骤3
	//判断条件
	if(my_strlen(str+1)>=2)
	{
     
		reverse_string(str + 1);//步骤4
	}

	*(str + len - 1) = tmp;//步骤5
}

字符串倒置经典笔试题解析

题目大致为:将一句话的单词倒置,标点不倒置,此题目曾是腾讯的面试题,综合了很多的知识,值得一看。和之前的逆序不一样,之前的逆序逆序完之后都不是一个正常单词了,而本题逆序之后仍是一个单词。基本思路就是“三步翻转法”,字符串整体逆序,每个单词逆序。但需要注意几点:

  1. 如果遇到\0结束单词逆序
    2.如果单词前面有空格跳过空格逆序单词,遇到\0不能跳过,不然这个程序就不会结束了,此时就结束逆序。
#define  _CRT_SECURE_NO_WARNINGS
//将一句话的单词倒置,标点不倒置
//字符串逆序函数,之后调用
void reverse (char *left, char *right)
{
     
	while (left < right)
	{
     
		char tmp = 0;
		tmp = *left;
		*left = *right;
		*right = tmp;
		left++;
		right--;

    }
}
#include 
#include 
int main()
{
     
	char arr[100] = {
      0 };//那个0不是字符串就不用加‘’了吧
	gets(arr);
	//三步翻转法
	//1.字符串整体翻转
	int len = strlen(arr);
	reverse(arr, arr + len-1);//从字符串的两端开始,交换字符串的内容
	//2.每个单词逆序,每个单词以空格隔开就是一个小的字符串
	char *start = arr;
	while (*start)
	{
     
		char *end = start;//
		while (*end !=' '&& *end !='\0')//两种情况,一个单词要么\0结束,要么空格结束,定义end找到结束的地方
		{
     
			end++;
		}
		//3.逆序一个单词
		reverse(start, end - 1);
		if (*end ==' ' )//
		{
     
			start = end + 1;
		}
		else
			start = end;//遇到\0不能跳过,不让这个程序就不会结束了

	}
	printf("%s\n", arr);
	return 0;
}

好了我的博客分享就到这里了,如果哪里有问题请及时评论区指正,另外创作不易,如果感觉我的分享对你有帮助的话,就请动动你的小拇指点赞加关注一下,你的鼓励是我创作的动力。哈哈哈!!!

你可能感兴趣的:(c语言学习,面试题,c语言,面试)