广而告知: 博客写得好,Emoji要选好!!🎵 🎶 🔈 🔇 🔉 🔊 🔔 🔕 📣 📢
写博客是知识是巩固和温习,所以在这个信息爆炸的时代,每个人每天都要接收很多讯息,你的记忆是有限的,知识也是有限的,时间也是有限的,既然如此,那是时候磨亮我的五十米大刀了。 你很强,上天揽月你不行,你很强,下海捞鱼总行吧!
💀☠💩🤡👹👺👻👽👾🤖 -->渴望知识!!!
目录
1.1.3 通过对比scanf()函数和gets()函数,我们确定好使用输入函数。
程序设计要求:
字符串逆序
这是一道经典题,使用指针头尾实现字符的交换。
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;
}
看运行结果:
最后,请各位发财的金手指,帮忙点点赞和关注!
💁♂️💁♀️🙋🙋♂️🙋♀️🧏🧏♂️一赞三连🧏♀️🙇🙇♂️🙇♀️🤦🤦♂️🤦♀️🤷🤷♂️🤷♀️
💁♂️💁♀️🙋🙋♂️🙋♀️🧏🧏♂️一赞三连🧏♀️🙇🙇♂️🙇♀️🤦🤦♂️🤦♀️🤷🤷♂️🤷♀️
💁♂️💁♀️🙋🙋♂️🙋♀️🧏🧏♂️一赞三连🧏♀️🙇🙇♂️🙇♀️🤦🤦♂️🤦♀️🤷🤷♂️🤷♀️