简单LinuxC程序关于逆序一个中英混合字符串

来源:互联网 发布:mac怎么压缩rar 编辑:程序博客网 时间:2024/05/23 13:28

题目:逆序一个中英混合字符串,此字符串包含字母字符、数字字符、空格字符、标点符号等英文字符以及中文字符,要求从键盘输入

源代码如下:

#include <stdio.h>#define MAX 100       //定义字符串的最大长度int main(){char ch[MAX];int len = 0;fgets(ch,MAX,stdin);     //使用fgets从键盘获取一个字符串while (ch[len]){len++;}ch[--len] = '\0';         //得到字符串长度,并去掉回车符int min = 0;int max = len - 1;int temp;while (min < max)          //字符串逆序(按字节长度){temp = ch[min];ch[min++] = ch[max];ch[max--] = temp;}int i = len;while (i != 0)          //从后开始扫描,遇到小于0的字符,则逆序自其往前三字符(UTF-8编码下中文字符占3个字节长度){i--;if (ch[i] < 0){temp = ch[i];ch[i] = ch[i - 2];ch[i - 2] = temp;i = i - 2;}}printf ("%s\n",ch);       //输出逆序后的字符    return 0;}

        本题中涉及几个知识点,首先是fgets()函数,这个我在之前的博客中提到过,想了解的可以去看看,反正很有用。第二个就是计算字符串长度,虽然有专门计算字符串长度的函数,但了解如何计算对我们的字符串学习很有帮助,原理就是从左向右扫描,扫描到空字符停止。接下来是字符串逆序,这个需要用到字符串长度,可以借用中间变量进行字符的交换,字符串的使用和数组类似。由于在UTF-8编码下,中文字符占3个字节长度,且首个字节保存的值是小于0的,而英文字符的值都大于0,所以我们可以从后往前扫描,碰到值小于0的,交换自其往前三个字符,其实只要交换一遍,就可以将中文字符的三个字节再次逆序回来,就可以正常输出中文字符了。

        此题类似于逆序一句英文语句,但不改变单词结构,需要逆序两次。虽然比较繁琐,但只要掌握基本原理,还是不难的。需要注意的是中文字符在内存中的存储方式。此程序也可逆序纯英文或纯中文的字符串。分享这个方法给大家,希望和大家一起交流。

阅读全文
1 0
原创粉丝点击