有关字符串的两个经典函数题

字符串的逆置

如题所述,字符串的逆置实际上就是倒着输出字符串,例如:输入ABCD,输出DCBA

其实这种逆置问题本质上就是排序,像我们之前学过对于数组内元素的逆置,是对元素进行排序,但是我们之前大部分接触的都是数组内元素使一些数字或者一个个的字母,而对于字符串里面的字符分开进行排序接触还不算多。之前针对数组内的数字进行排序的话我们学过冒泡循环,选择排序之类的,大部分其实都是历遍数组对组内元素的下标进行标记然后用下标访问回组内元素进行元素间的大小比较,得出结果之后再次历遍数组对新数组的内容进行存储,接着就是输出。

那么字符串内的单个字符之间进行排序的思路和之前学的数组里面的数字的排序思路大同小异。

那么思路来了,既然我们学过数组内的元素的转置,为何不把字符串也存储到一个数组中创建一个字符串数组来对字符串里面的单个字符进行转置呢?所以接下来引申出来的,就是字符串数组。

在c语言中,字符数组没有内置的字符串操作的功能,我们需要借助字符串处理函数库(<string.h>)来处理字符串。

首先我们先定义一个字符串数组名称str,(众所周知数组名在本质上是一个指向字符的指针,指向数组的首地址),然后再引入输入字符串的函数,然后创建一个函数对字符串数组内的元素进行逆置,引用函数之后再把目标字符串打印出来就成了。

具体实现形式:

#include <stdio.h>
#include <string.h>
char* reversestring(char* str)
{
int length=strlen(str);
char temp;
int start=0;
int end=length-1;
while(start<end)//这里其实就是第一位和最后一位换,次前位与次末位换,以此类推
{
temp=str[start];
str[start]=str[end];
str[end]=temp;
start++;
end--;
}
return str;
}

int main()
{
char str[100];
printf("请输入字符串: \n");
scanf("%s",str,sizeof(str));//这里不用&是因为str数组名本质上就是一个指针,指向第一个元素的地址
//在scanf里面加上sizeof(str)是为了将缓冲区的大小作为参数传递,确保输入不会导致缓冲区溢出
char* ABC=reversestring(str);
printf("%s  ",ABC);
return 0;
}

 上面的代码的函数部分我们是通过元素的下标来对元素的位置进行调换的,我们还可以用指针来试试:

void reverse(char* str)
{
char* left=str;
char* right=str+length-1;
while(left<right)
{
char temp=*left;
*left=*right;
*rigth=temp;
++left;
--right;
}
}

 两种方法大同小异,本质上都是借助某一个东西去访问字符串数组里面的元素。他们在编译器跑出来的结果:

以上就是对字符串的逆置,接下来让我们看看字符串的旋转。

字符串的旋转

字符串常见的旋转就是左旋,当让右旋也有但是没左旋的频率高。

首先让我们看看左旋是怎么个事。

左旋顾名思义其实就是把字符串左边的字符向右旋转一百八十度,例如ABCD左旋一位是BCDA,左旋两位是CDAB,左旋三位是DABC...以此类推

思路:

先创建一个左旋函数,还是用下标来访问字符串数组的元素。我们先用temp来标记str[0]的位置,然后再写一个循环让排在首位的字符依次往后挪直到挪到末尾,当需要左旋的位数>1时,就继续把第二个字符往后挪到末尾,以此类推。

  

写成代码就是这样:

#include <stdio.h>
#include <string>
void zuoxuan(char* str,int k)
{
	int length = strlen(str);
	char temp;
	for (int i = 0; i <k; i++)//从0位开始计算的话本来就是不能达到k的
	{
		temp = str[0];//先把第一个数挪到最后,然后再把第二个数挪到最后...
		for (int j = 0; j < length - 1; j++)
		{
			str[j] = str[j + 1];

		}
		str[length - 1] = temp;
}
}

int main()
{
	int k = 0;
	char str[1000];
	printf("请输入字符串:\n");
	fgets(str, sizeof(str), stdin);
	str[strcspn(str, "\n")] = '\0';//这里是把字符串数组中的换行符用空字符来替代,避免存储的时候因为输入的形式而出现差错 
	printf("请输入需要左旋的字符个数:\n");
	scanf_s("%d", &k);
	zuoxuan(str, k);
	printf("%s",str);
	return 0;
}

 这里先介绍一个函数(fgets),fgets是用来专门读取用户输入的字符串的,里面包含三个参数str,n,stdin,     str是指向存储读取字符串的字符数组的指针,n是要读取的最大字符数,stdin是一个文件指针,要对用户输入的数据进行读取和存储。

使用fgets函数的优势:
   - 避免缓冲区溢出:`fgets` 函数提供了更安全的方式来读取字符串,因为它可以指定要读取的最大字符数,从而避免了缓冲区溢出的风险。
   - 读取整行:`fgets` 函数读取整行输入,包括换行符,这对于处理用户输入的完整行非常有用。
   - 适用于不同类型的输入:`fgets` 可以从多种类型的输入流中读取,包括标准输入、文件等。

如果只需要读取字符串,并希望避免缓冲区溢出等安全问题,建议使用 `fgets` 函数来获取用户输入的字符串。如果需要按照特定格式读取不同类型的数据,则可以使用 `scanf_s` 或其他适合的输入函数。

这两个有关字符串的经典函数题到这里就结束啦,如果觉得还不错的话就留下一个赞赞吧~

(ღ( ´・ᴗ・` )比心)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值