对输入字符串进行逆序输出,使用指针操作(指针篇百题3)

广而告知: 博客写得好,Emoji要选好!!🎵 🎶 🔈 🔇 🔉 🔊 🔔 🔕 📣 📢
写博客是知识是巩固和温习,所以在这个信息爆炸的时代,每个人每天都要接收很多讯息,你的记忆是有限的,知识也是有限的,时间也是有限的,既然如此,那是时候磨亮我的五十米大刀了。 你很强,上天揽月你不行,你很强,下海捞鱼总行吧!

💀☠💩🤡👹👺👻👽👾🤖 -->渴望知识!!!

目录

程序设计要求:

字符串逆序

 1.写一个函数,可以逆序一个字符串的内容。

1.1分析:如何获取键盘输入字符

1.1.1 使用scanf()函数来获取输入字符。

1.1.2 使用gets()函数来获取字符串

1.1.3 通过对比scanf()函数和gets()函数,我们确定好使用输入函数。

1.2 分析 再定义一个字符数组用来存放需要逆序的字符串

1.3 使用指针要进行字符串的逆序


程序设计要求:

字符串逆序

这是一道经典题,使用指针头尾实现字符的交换。

 1.写一个函数,可以逆序一个字符串的内容。

例如:

输入:AB AC

输出:CA BA 

1.1分析:如何获取键盘输入字符

要实现字符串的逆序,那么我们需要注意,如果字符串里面有空格也需要当作字符串的一部分。

当键盘输入的时候,我们要使用什么函数去获取输入的字符?

如果使用scanf(“%s”,str)函数,我们会发现连续的字符会存储进去,但是如果是空格,则只会截取空格之前的字符。 

1.1.1 使用scanf()函数来获取输入字符。

int main()
{
	
	char str[128];
	scanf("%s", str);
	printf("%s\n", str);

	return 0;
}

例:

输入abc 

输出abc

例:

输入AB AC

输出AB

1.1.2 使用gets()函数来获取字符串

上代码:

#include <stdio.h>
int main()
{

	char str[128];
	printf("输入字符串\n");
	gets(str);
	//printf("输出字符串为%s\n", str);
	printf("使用puts输出字符串\n");
	puts(str);
	
	return 0;
}

例:

输入abc 

输出abc

例:

输入AB AC

输出AB

1.1.3 通过对比scanf()函数和gets()函数,我们确定好使用输入函数。

1.2 分析 再定义一个字符数组用来存放需要逆序的字符串

如果在没有学习指针之前,我们用数组也完全可以实现一个字符串的逆序。

上代码:

#include <stdio.h>
#include <assert.h>
void my_swap(char my_str[], int numsize)
{
	char str[10000];
	for (int i = 0; i < numsize; i++)
	{
		str[i] = my_str[i];
	}
	for (int j = 0; j < numsize; j++)
	{
		my_str[j] = str[numsize -1-j];
	}
}

int main()
{
	char my_str[10000];
	gets(my_str);
	int numsize = strlen(my_str);
	my_swap(my_str,numsize);
	puts(my_str);
	return 0;
}

看一下执行结果:

从以上的代码,我们发现,使用数组交换也可以实现字符的交换。

而本题要求是使用指针来进行字符的逆序,显然以上这种方式不符合要求。 

1.3 使用指针要进行字符串的逆序

分析:

既然要使用指针交换

那么我们需要使用指针找到存放字符数组的每一个地址,并且指针可以指向任意一个地址,并且对指针指向的地址进行解引用,取出地址中存放的数据。

我们定义起始地址start 和end 地址

并通过str获取了start 和end指向的地址 start=0;end=字符串实际长度减去1;

并且使用while(start<end)作为循环条件,条件结束也就是指针指向的地址进行解引用,取出地址中存放的数据完成了交换。

上代码:

#include <stdio.h>
void resevre(char* str)
{
	const char* my_str = str;
	char *start = my_str;
	char *end = str + strlen(str) - 1;
	while (start < end)
	{
		int temp = *start;
		*start = *end;
		*end = temp;
		++start;
		--end;
	}
}

int main()
{
	char str[128];
	gets(str);
	resevre(str);
	puts(str);
	return 0;
}

看下运行结果:

1.4 上面的输入字符是不是每次都要关掉控制台,有没有办法优化呢,使用memset函数

显然是有的,我们可以加入while(gets(str)),这个只要输入字符串不为‘\0’,那么程序始终在循环内。 

因为是循环操作,所以这里,在每一次操作之前,我们需要对存放字符的数组进行内存清除。

使用memset(str, 0,sizeof(str) / sizeof(str[0]));就可以每次写入字符之后,将原来的数据清除。 

上代码:

#include <stdio.h>
void resevre(char* str)
{
	const char* my_str = str;
	char* start = my_str;
	char* end = str + strlen(str) - 1;
	while (start < end)
	{
		int temp = *start;
		*start = *end;
		*end = temp;
		++start;
		--end;
	}
}

int main()
{
	char str[128] = {0};
	while (gets(str))
	{
		resevre(str);
		puts(str);
		memset(str, 0,sizeof(str) / sizeof(str[0]));
	}
	//gets(str);
	//resevre(str);
	//puts(str);
	return 0;
}

看运行结果:

最后,请各位发财的金手指,帮忙点点赞和关注!

💁‍♂️💁‍♀️🙋🙋‍♂️🙋‍♀️🧏🧏‍♂️一赞三连🧏‍♀️🙇🙇‍♂️🙇‍♀️🤦🤦‍♂️🤦‍♀️🤷🤷‍♂️🤷‍♀️

💁‍♂️💁‍♀️🙋🙋‍♂️🙋‍♀️🧏🧏‍♂️一赞三连🧏‍♀️🙇🙇‍♂️🙇‍♀️🤦🤦‍♂️🤦‍♀️🤷🤷‍♂️🤷‍♀️

💁‍♂️💁‍♀️🙋🙋‍♂️🙋‍♀️🧏🧏‍♂️一赞三连🧏‍♀️🙇🙇‍♂️🙇‍♀️🤦🤦‍♂️🤦‍♀️🤷🤷‍♂️🤷‍♀️
 

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值