美观化文字《汉字的切割问题》

注意:你可以认为所有中文字符由两个字节组成,首字节的ASCII值都大于127(也可以理解为signed char型小于0)

题目:

请看下面两段文字:

Kenny喊道:"我来了!"

Kenny喊道:“我来了!”

前面一段文字中由于在中文中使用了英文标点,显得不太美观。本题中你的任务是让任意一段文字美观化。美观化具体要求为将以下字符(串)转换为对应的中文字符:


英文 中文
, ,
. 。
! !
" “或”
<< 《
>> 》
? ?

Input输入文字只有一段。文字中可能含有中英文、符号以及控制符(换行、空格、制表符等)。Output按照要求输出美化后的文字段。 你不用翻译以上指定的符号之外的所有字符。Sample Input

Kenny喊道:"我来了!"

Sample Output

Kenny喊道:“我来了!”


        
 分析:
1.输入一换行符结束。
2.对双引号的处理分两种情况:1)英文的双引号,2)汉字符中也有双引号对后面和前面的干扰。
3.怎样判断汉字符
4.怎样在字符串中切割汉字符

代码如下:
#include<iostream>
#include<string.h>
using namespace std;
#define Max 10000
char source[Max];
char ch1[] = ",";
char ch2[] = "。";
char ch3[] = "!";
char ch4[] = "《";
char ch5[] = "》";
char ch6[] = "?";
char ch7[] = "“";
char ch8[] = "”";
int main()
{
 int n = 1;
 while (cin.getline(source, Max))
 {
  int pow = 0;
  int len = strlen(source);
  char chol[3];
  for (int i = 0; i < len; i++)
  {
   if (source[i] == ','){ printf("%s", ch1); }
   else if (source[i] == '.'){ printf("%s", ch2); }
   else if (source[i] == '!'){ printf("%s", ch3); }
   else if (source[i] == '?'){ printf("%s", ch6); }
   else if (source[i] == '<'&&source[i + 1] == '<')
   {
    i++;
    printf("%s", ch4);
   }
   else if (source[i] == '>'&&source[i + 1] == '>')
   {
    i++;
    printf("%s", ch5);
   }
   else if (source[i] == '"')
   {
    if (n%2)
    {
     printf("%s", ch7);
     n++;
    }
    else
    {
     printf("%s", ch8);
     n++;
    }
   }
   else if (source[i] < 0)
   {
    chol[pow++] = source[i];
    if (pow == 2)
    {
     chol[pow] = '\0';
     printf("%s", chol);
     if (strcmp(chol, ch7) == 0){ n++; }
     if (strcmp(chol, ch8) == 0){ n++; }
     pow = 0;
    }
   }
   else
   {
    printf("%c", source[i]);
   }
  }
  printf("%c", '\n');
 }
 return 0;
}

算法分析:由于汉字符占两个字节而英语字符占一个,如果选择将英文字符换成汉字符的思想是不可行的。
因为每次交换都要向后移动部分数组或者将一段段的放到另一个数组中这样就会有遍历出现导致时间变长。
而在oj平台只是测试输出文件的内容是否正确就行。所以所采取的算法就是,遇到要转换的字符直接输出
需要转化的字符就行对字符串本身不做过多操作。
对双引号的处理有两种方法:1.使用奇数偶数,2.使用bool数(其实只要有两面性的表示都可以)

对汉字符的处理,判断char类型是否<0,若为汉字就每次存储两个字节在数组中就行。
数据结构:

对”“,《》因为是两个字节,所以必须以字符串的形式存储。

转载于:https://www.cnblogs.com/damaoranran/p/8645508.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值