今天阿博给大家给csdn的友友们分享一下双重逆序的做题感悟和分析😊😊😊 |
一.将一句话的单词进行倒置,标点不倒置。比如输入 I LIke Beijing.经过函数变为Beijing. Like I
当我们看到提后,我们首先就会想到逆序字符串,但是这一题比较特殊,当我们逆序完字符串之后,它的效果就会变为.gnijieB ekiL I,这不是我们想要的,所以这时候我们就需要对每个单词也做出逆序的处理,这就是今天的双重逆序😎😎😎.
二.代码实现
这里我们首先需要输入一个数组
#include<stdio.h>
int main()
{
char arr[101] = { 0 };
scanf("%s", arr);
printf("%s\n", arr);
return 0;
}
兄弟们注意了,这里我们就不能再用scanf了,因为如果用scanf的话,当输入的字符之间有空格的时候,只能打印空格之前的字符.这里给兄弟们介绍一个小法宝🌹🌹🌹
而gets的功能刚好就是输入字符串,当我们这里用gets的话,就不会出现上述情况了
好了,接下来我们该逆序整个字符串,这里我们直接上代码.
void reverse(char* left, char* right) /*这里我们形参用指针接收首元素和末尾元素的地址*/
{
assert(left && right);
while (left < right)
{
char temp = *left;
*left = *right;
*right = temp;
left++;
right--;
}
}
int len = strlen(arr);
reverse(arr, arr + len - 1);
我们可以自定义一个reverse函数,这里arr就是字符串首元素的地址,arr+len-1就是末尾元素的地址,这里可能会有些友友不是很清楚,指针加整数n就是跳过n个指针类型大小!!!
接下来我们该逆序每个单词了,代码走起.
char* cur = arr; /*接下来我们该逆序单词了*/
while (*cur)
{
char* start = cur;
while (*cur != ' ' && *cur != '\0') /*这里我们必须加上\0,因为如果当字符串后面没有字符时,它的结尾是\0,而此时我们不需要cur++了*/
{
cur++;
}
reverse(start, cur - 1);
if(*cur==' ') /*这里也要加上限制条件,如果字符串都逆序过了,在进行加加就有可能陷入死循环*/
cur++;
}
这里我们用两个while循环,第一个while循环的意思是当*cur为‘\0’的时候,‘\0’的ascll值为0,所以每个单词都完成了逆序,循环将不再进行.第二个while循环的意思是当cur不等于空格或不等于‘\0’的时候,我们让cur++,以此来完成每个单词的逆序,这里我们需要注意了,第二个while循环中逻辑与的第二部分我们很可能不加,如果没有不等于\0这个条件,当逆序完最后一个单词的时候,cur++,这时候程序很可能就进入死循环.
同理如果我们第二个if语句没加的话,当逆序完最后一个单词的时候,cur++,这时候程序也很可能就进入死循环.
当我们写完代码的时候,要对指针进行断言,assert(left&&right),断言left和riight不是空指针,增强我们代码的强壮性.🥰🥰🥰
接下来是代码的全部实现
#include<stdio.h>
#include<assert.h>
void reverse(char* left, char* right) /*这里我们形参用指针接收首元素和末尾元素的地址*/
{
assert(left && right);
while (left < right)
{
char temp = *left;
*left = *right;
*right = temp;
left++;
right--;
}
}
int main()
{
char arr[101] = { 0 };
gets(arr); /* 这里不能用scanf,因为当有空格的时候,scanf跳不过去*/
int len = strlen(arr);
reverse(arr, arr + len - 1); /*这里我们逆序整个字符串*//*,*//*arr传入的是首元素的地址,arr+len-1传入的是末尾元素的地址*/
char* cur = arr; /*接下来我们该逆序单词了*/
while (*cur)
{
char* start = cur;
while (*cur != ' ' && *cur != '\0') /*这里我们必须加上\0,因为如果当字符串后面没有字符时,它的结尾是\0,而此时我们不需要cur++了*/
{
cur++;
}
reverse(start, cur - 1);
if(*cur==' ') /*这里也要加上限制条件,如果字符串都逆序过了,在进行加加就有可能陷入死循环*/
cur++;
}
printf("%s\n", arr);
return 0;
}
好了,兄弟们,以上就是阿博所有的总结了,如果感觉有帮助的话,可以给阿博点个关注哦,我们一起学习编程,下期再见💞. |