下面是最近一段时间的C语言初阶考试编程题:
题目大意:例如, 将一个字符串“I like beijing.” 反转成“beijing. like I”
初看这道题目时,很容易犯下的一个错误是“不就是将字符串反转打印出来吗!!”呵呵,这是我的第一印象!我给了自己“呵呵”两个字,算作自我嘲解吧!
这道题目新颖点,我认为有以下几点:首先,这道编程题目,不同于以前做过的。小伙伴们,仔细看看反转之后的字符串有哪里不一样!答案当然是,竟然连标点符号都反转了!! “what!” 不要着急,上来我也是错误思路走起!
再者,大家请看,这道编程题还有一个最大的特点,不同于以前做过的反转题目,那就是单词反转之后并不是倒着逐个字母打印!而是打印出来之后,还是正序时候的单词原样貌!相信已经有小伙伴有思路了吧!
下面请看我的思路:
首先,我们应该对字符串进行反转,之后再将反转之后的倒着打印的单词再一次翻转过来,不过在这一个过程中,请注意还有标点符号跟着哦!
废话不多说,请看下面的代码:
#include <stdout.h>
#include <string.h>
#include <assert.h>//此库函数针对所接收到的指针不能是空指针
void reverse(char *left, char *right) //这里指针的运用是为了方便行走字符串
{
while(left < right)//至于为什么是'left < right' 是因为数组中元素下标是从零开始的
{
assert(left && right);//判断left 与 right不能是空指针,不然的话,经检验输入字符串后按下回车程序会自动结束掉
//下面是交换了,此处还运用了‘空油瓶’
char tamp = *left;
*left = *right;
*right = tamp;
//下面的++和--是为了方便让指针在一次循环中能行走一位,也只能是一位,不然不合题意了
left++;
right--;
}
}
int main()
{
char arr[50];
gets(arr);//gets()类似于scanf()是得到输入的字符串
int len = strlen(arr);//求字符串长度,需要调用库函数'string.h'
//对于求字符串长度如果嫌调用库函数的做法太麻烦了,可以直接求,用sizeof(arr)/sizeof(arr[0])就可以了
//反转字符串
reverse(arr, arr + len - 1);//这里进行传参,其中'arr + len - 1'的意思是数组的整个长度。
//注意这里的arr可以省略不写,这里写上只是为了美观.不写的原因是arr代表着数组元素的首地址下标是零
//反转单词
char *cur = arr;//这里的引入新的指针变量,为了将arr数组元素中首地址存入,便于后续经过自增后读取到下一位
while(*cur) //循环体的意义是当指针*cur为假时(即不符合要求的时候)跳出循环,执行打印结果!
{
char *start = cur;//这里引入新的指针start是为了将指针cur的全部地址都存入到start中,便于后续进行函数调用传参反转字符串
while(*cur != ' ' && *cur != '\0') //这里的&&操作符的意思是并且,当有一个成立的时候就会执行,当前一个不满足的时候,只要后面的那一条语句符合条件也会进入循环体
{
cur++;//指针向下一位移动
} //注意这里千万不可以用||(或者)操作符,因为这样就表示当前一个不符合条件的时候就会跳出循环体。这样直接导致我们想要反转的标点符号也不能跟着反转过来了。
reverse(start, cur - 1);//此处为了在循环过程中将单词逐个进行反转,必须调用的
//下面的判断条件为什么会这样呢?我认为还是很有必要说明一下的。假设,没有此条语句判断会出现什么现象呢?我的答案是:
//循环没有终止,而且不知道终止在哪里!!因为当指针读取到我们想要的标点符号的时候,会因为‘跳过’,而没有进行读取到,直接跳到了空白区域,这样怎么会有结束的时候呢!!显然没有
if(*cur = '\0')
{
cur++;
}
}
printf("%s\n", arr);//最终的打印就是我们想要的结果了!!
}
本次书写在一定程度上超越了作者的写作水平了,一气呵成竟然用了一个多小时。创作过程中的走逻辑感觉真的很不错。希望接下来的步骤,交给小伙伴们了!走一走逻辑,这究竟是一种怎样的体验。在回顾的过程中,也是对知识的再一次总结和巩固!总有新的收获!
好了,今天的探讨就到这里了,愿你们的未来可期!感谢阅读!
标签:arr,right,cur,反转,C语言,字符串,指针 From: https://blog.51cto.com/u_15808800/5907450