Bootstrap

嘘!禁止想象(各大厂都爱考的一道编程题,你们知道吗?)

Hello,你好呀!偷偷告诉你喔,这道题非常经典,快来和我一起学习叭!(文末附源码)

Question:任意输入一字符串,要求逆序输出,但字符串内的单词顺序不变,包括标点符号。例:输入"I Like Beijing.",则输出"Beijing. Like I"。

这道题具体怎么操作呢?我相信您肯定有一定的C语言基础,对于该题所涉及的知识点就不必再进行讲解,怎么编程,我给您细细道来!

拿到这道题,首先构思,在心里想一想如何处理,这个小算法如何设计?很显然,单纯的交换整个字符串内容是不可取的,那样输出的结果是完全逆序的。那到底怎么才能实现呢,我们这样想:先进行字符串全部数据的逆序,然后进行判断单词的位置,将每个单词再进行单独的逆序(包括某一单词后面是否有标点符号),然后打印该字符串数组,好的,我们理论存在,实践开始!

1、定义main函数,初始化字符串数组内容

 2、获取任意字符串

 我们都知道,scanf函数能获取整型变量,是这样使用的:scanf("%d",&a);在获取字符串的时候呢,是这样使用的:scanf("%s",str)。但是,scanf函数有个弊端,就是遇到含有空格的字符串时,只会检测到空格前面的数据,比如你输入ab  cd,他只能检测到ab,所以,我们这里要使用gets()函数,即:gets(arr);

3、如何将这个字符串逆序

如何实现这一功能是本设计的关键处。我们懂得数组名就是数组首元素的地址,所以,需要利用这一点,和指针建立联系,创建一个逆序字符串的函数,就把该函数定义为reverse()函数吧。那该函数的参数怎么设置,要怎么传参呢?所传递的参数要在函数内部怎么实现我们想要的功能呢?这是本函数设计的核心点,接下来分几个步骤一一道来。

①参数设置

这么想,要实现逆序功能,我们肯定要知道首尾的元素或者这两者的地址,然后互相交换,遍历实现。因为数组名是数组首元素的地址,所以,reverse函数的第一个参数就直接是arr本身(最左边的数据),最右边的数据就用(arr + 数组长度 - 1)来求,而数组长度为len=strlen(arr)。故逆序函数可写成这样------reverse(arr,arr+len-1);

②传参

该函数不需要返回值,所以定义为void,函数内部的两个参数都是char*的类型,分别访问的是字符串的最左边内容和最右边内容。即,void reverse(char*left,char*right){   };

③功能实现

写一个while循环,循环体内部要实现数据的交换功能,即创建一个新的char变量,两两交换,然后left向右移动,即left++,right向左移动,即right--。循环条件是(left<right)。

reverse函数代码如下:

 4、实现单词的逆序

目前我们得到的是这个字符串的逆序,现在只需找到每个单词的位置,然后将其再逆序一下,其功能就实现了。那怎么才找到单词呢???我们不难发现,每两个单词之间都会有空格,和最后一个单词后边是'\0',依照这点,我们可以这样写代码,如下所示:

 设置一个char*的start变量为数组的首元素地址,这个字符串数组的遍历,到'\0'结束,所以用while(*start)循环,当遇到'\0'时跳出循环。在循环体内,在找一个end作为终止变量,判断空格和'\0'使用,如果不是空格和'\0',就end++,是的话跳出循环,说明找到了一个单词,然后逆序该单词,reverse(start,end - 1)。

这里还有一个细节,由于最后一个数据后没有空格,只有一个'\0'结束标准,所以,就会有两种情况,如果是空格,start = end + 1;如若不然,start = end。

5、打印字符串数组

printf("%s",arr)即可。

总代码如下图:

 以上便是本期的全部内容了,如果对您有帮助,希望收藏转发加评论哟!

 

 

 

 

;