今天我们将用两种方法玩转字符串的反转!!
题目:将一句话的单词进行倒置,标点不倒置。比如“I like beijing."经过处理后变为:“beijing. like I"即可,字符串长度不超过100。
首先我们对题目进行分析,反转字符串就是将数组中的元素位置进行互换从而达到效果,但是当我们对字符串前后进行互换时,会出现”.gnijieb ekil I"这与我们预先的目标不一致,这个题就特殊在这里。我们要进行二次交换,对字符串中的每个单词进行交换,把每一个单词看作一个整体在进行一次数组交换即可。
#include<stdio.h> #include<string.h> int main(void) { char arr[101]; gets(arr); char* ph = arr; int sz = strlen(arr); exchange(arr, sz); while (*ph != '\0') { int count = 0; char* p1 = ph; while (*ph != ' ' && *ph != '\0') { count++; ph++; } exchange(p1, count); if (*ph != '\0') { ph++; } } printf("%s\n", arr); return 0; }
为什么不用scanf函数呢?因为scanf函数在遇到字符串中的空格时会停止读,这时我们可以借助gets或fgets函数进行读取字符串,fgets是gets的升级版,gets无法避免读取数是否超过创建字符串的空间大小,而fgets就可以很好的避免。
一般使用fgets是在文件中的流输入,也可以将函数参数中的最后一项改为stdin(键盘流输入)即可,中间的参数是获取读入数据的数量。
面对这个提也可以将字符串中的单词先反转,再将字符串反转得到的结果大同小异。
我在给大家引入一个新的方法,脑洞大开的方法:我们可以先将数组中的空格全部转换为\0,然后从后面向前打印字符串即可。将一个个单词看作一小个字符串,找到后面的指针指向最后单词的头向前打印,但是循环会打印不了第一个单词,所以我们可以在循环外在打印一遍指针的内容即可按照题目要求完成!
int main(void) { char arr[101]; gets(arr); int sz = strlen(arr); char* right = arr + sz -1; exchange(arr, sz); while (arr != right) { if (*right == '\0') printf("%s ", right+1); right--; } printf("%s\n", right); return 0; }
这两种方法从不同的角度反转了字符串,我们可以熟练掌握玩转它们!!!