中文字符的简单处理。。。

三体代码问题分析。

粗过题意,即理解为统计出现次数最多的四个中文汉字。

该题难点在于中文汉字的编码问题

故想要做出该题来,需要了解一部分中文汉字在计算机中编码中的相关知识。

一,

基本思路:将该段文字传入一个char类型数组中,然后再开一个相应的计数数组。

遇到标点符号,进行跳过处理,continue。遇到与前方相同的汉字,在相应的计数数组中,次数加1.再把相同汉字替换为中文标点符号,例如中文句号。

即在遍历之后,该段文字变成只保留汉字第一次出现的,无重复的(重复的已经变成了句号)。

二,

问题简化:即不考虑次数相同的情况。

三,

遇到的问题,即注意事项:1.输出汉字时需要%c%c连用,不然会出现???

例如,printf("%c%c",s1[i],s1[i+1]);

2.汉字与英文单词有所不同的是,汉字由两个char组成。故一个跨度为+2

3.具体汉字的编码需要在具体的计算机上测试出,网上的有些,不适用,实践出真知,不要盲目信网上的(浪费我好长时间)。

/*

他采取的加密方式是使用“不要回答”4个汉字的二进制编码依次

替换了叶文洁所发送的信息(不包括标点符号)中出现次数最多的4个汉字的

二进制编码。

 

请问地球接收到的回复信息经汉字编码后是什么?

 

*/

#include<bits/stdc++.h>

using namespace std;

//一个汉字占两个char!!!!!!!

char s1[1000]="向收到该信息的世界致以美好的祝愿。通过以下信息。你\

们将对地球文明有了一个基本的了解。人类经过漫长的劳动和创造,建立了灿烂的\

文明,涌现出丰富多彩的文化,并初步了解了自然界和人类社会运行发展的规律,\

我们珍视这一切。但我们的世界仍有很大缺陷,存在着仇恨、偏见和战争,由于生\

产力和生产关系的矛盾,财富的分布严重不均,相当部分的人类成员生活在贫困和\

苦难之中。人类社会正在努力解决自己面临的各种困难和问题,努力为地球文明创\

造一个美好的未来。发送该信息的国家所从事的奉业就是这种努力的一部分。我们\

致力于建立一个理想的社会,使每个人类成员的劳动和价值都得到充分的尊重,使\

所有人的物质和精神需要都得到充分的满足,使地球文明成为一个更加完美的文明。\

我们怀着美好的愿望,期待着与宇宙中其他文明社会建立联系。期待着与你们一起,\

在广阔的宇宙中创造更加美好的生活。";//读入原文

 

int max(int *a)

{

int max=a[0];

int temp=0;

for(int i=0;i<=1000;i=i+2){

if(a[i]>max)//不考虑数量相同的情况

{

max=a[i];

temp=i;//temp记最大数的下标

}

}

a[temp]=0;//置零,进行取下面第二大的数

return temp;

 

}

int main()

{

int a[1000];memset(a,0,sizeof(a));

for(int i=0;i<strlen(s1);i=i+2){//拿出一个来遍历对比原文 //问题有无等号。。。

if((s1[i]==-95&&s1[i+1]==-93)||(s1[i]==-93&&s1[i+1]==-84)||(s1[i]==-95&&s1[i+1]==-94))//遇到标点的操作,跳过

{

continue;

}

for(int j=i+2;j<strlen(s1);j=j+2){//全文过一遍 //问题有无等号 ...

//if((s1[i]==0X30&&s1[i+1]==0x02)||(s1[i]==0XFF&&s1[i+1]==0x1F)||(s1[i]==0XFF&&s1[i+1]==0x01)||(s1[i]==0XFF&&s1[i+1]==0x0C)||(s1[i]==0XFF&&s1[i+1]==0x1B)||(s1[i]==0XFF&&s1[i+1]==0x1A)) continue;//if(s1[i]==''||s1[i]==''||s1[i]==''||s1[i]=='A'||s1[i]==' ') continue;

if(s1[i]==s1[j]&&s1[i+1]==s1[j+1]) {//用遍历的比对原文,原文的变成A

s1[j]=-95;//如果相等,原文的变成A //问题所在:这样我只是把第一个字节的,变成了A,就变成了其他的字,s1[j]='A';

s1[j+1]=-93; //变成中文井号吧,中文句号的ASCII0XFF23

a[i]++;//记录下标,记住i ,方便以后遍历

 

}

}

 

}

 

//printf("%c %c %c %c",s1[max(a)],s1[max(a)],s1[max(a)],s1[max(a)]) ;

/*for(int i=0;i<=strlen(s1);i=i+2)

{

printf("%c%c",s1[i],s1[i+1]);

}*/

printf("%s",s1);//问题全变成空格了,信息也被覆盖了。。。

int t1,t2,t3,t4;

t1=max(a);t2=max(a);t3=max(a);t4=max(a);

printf("\n%c%c %c%c %c%c %c%c",s1[t1],s1[t1+1],s1[t2],s1[t2+1],s1[t3],s1[t3+1],s1[t4],s1[t4+1]) ;

return 0;

}/*

井号       FF23

句号    3002  。 -95 -93

 

问号    FF1F  ?

 

叹号       FF01  !

 

逗号    FF0C  , -93 -84

 

顿号    3001  、 -95-94

 

分号    FF1B  ;

 

冒号    FF1A  :

/*

#include <stdio.h>

//读一个字符

int main(int argc,char *argv[])

{

    FILE *p = fopen("/Users/Devin/Desktop/a.txt", "r");

    if (p == NULL)

    {

        printf("文件打开失败\n");

    }

    else

    {

        char c = 0;

        while( (c = getc(p)) != EOF)//EOF代表文件最后的一个结束标示

        {

            printf("%c", c);

        }

        //使用完,关闭文件

        fclose(p);

    }

    return 0;

}

*/

 

posted @ 2021-10-26 11:18  的和文一  阅读(178)  评论(0)    收藏  举报