博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PAT 乙级 1033
阅读量:4946 次
发布时间:2019-06-11

本文共 3203 字,大约阅读时间需要 10 分钟。

题目

    题目地址:

 

题解

    本题一直有一分的样例点过不了,原因在于用了cin接收输入的字符……

    问题在于:如果用cin输入,无法接收无坏键的情况的输入,需要getline作为输入;这就涉及到cin和getline的不同,这一部分我看到一篇博文写得很好,就直接粘过来,先贴出原博文的地址:

 

cin>>这个表达式应该分为两部分来看:cin 和>>

其中cin仅仅是一个istream对象!!!它的值反映的是当前输入流的状态:即cin对象接下来能否进行输入操作(能否从cin对象中读取数据)

cin对象实际上面向两方面的功能:

    1.外部设备与cin之间:这部分对于程序员来说是透明的

      设备(键盘)对它的修改,即通过设备直接修改cin对象,通过这个可以直接修改cin对象的状态(能否从cin对象中读取数据)

    2.cin和内存(各种对象,变量)之间:

      将cin中的数据读取出来,并赋予各种对象,变量

    而这两方面的功能都不由cin对象完成,cin对象实际上只是一个状态数据量,1功能有外设(键盘)完成,2功能由<<和getline等等运算符完成

................................................

有了上面的对cin对象全方面的了解,接下来对>>运算符的分析就手到擒来了

    >>运算符的作用实际上就是从cin对象中读取数据,并将数据赋予给右侧的各种对象或者变量,也就是上述的第2部分的功能了

     那么>>运算符有哪些特性呢?毕竟输入输出总得控制开始和结束吧

      1.>>运算符是由右侧的数据类型定义的,右侧的数据类型不同,重载的>>也不同

      2.>>运算符是向左结合的

      3.>>运算符从cin对象中读取数据时:如果遇到空格或者换行符号,那么这次读取数据结束,将空格之前的数据赋给右侧的运算对象,相应的,读取的第一个符号,也是空格或者换行符之后的第一个有效数据

      4.一个>>运算符一次只能读取一次(一个)数据,要想读取多个数据,只能再加>>运算符

......................................................................

好吧,以上4个,就是>>的性质了,那么有些人又要问了,那么Ctrl+Z(~Z)文件结束符号又是怎么一回事呢?

其实这个文件结束符和>>完全就是风马牛不相干,有些人总是将Ctrl+z和>>联系在一起

      文件结束符号:就是cin对象功能一中的一个性质!也就是说,你可以把文件结束符看成是外设的功能:

      一旦从外设中遇到文件结束符(或者是无效的输入),cin对象的状态就会变为假!!,也就是说外设多不能向cin对象写值了!!!

      自然<<运算符号就无效了

......................................................................

getline

    1.它是String对象定义的,只能string对象用(当然<<也是String对象重载的)

    2.getline遇到空格不结束!!!也就是说它可以从cin对象中读取空格!!当然,遇到换行仍然结束,但是他也会读取换行符,但是读取换行符之后后停止读取,然后将读取的数据(此时包括换行符)赋给右侧的运算对象(x,见下),赋值的时候,丢弃换行符!!!,也就是说换行符不存到x中

getline的返回值是流参数和cin>>表达式一样,返回cin>>

    3.getline是一个函数的形式:

    调用如下:

  string x;

  getline(cin ,x);返回值为cin的状态

 

代码

1 #include 
2 #include
3 using namespace std; 4 5 int vis_loc(char c) { 6 int loc = 0; 7 if (c >= 'a' && c <= 'z') 8 loc = c - 97; 9 else if (c >= 'A' && c <= 'Z')10 loc = c - 39;11 else if (c >= '0' && c <= '9')12 loc = c + 4;13 else if (c == '_')14 loc = 62;15 else if (c == ',')16 loc = 63;17 else if (c == '.')18 loc = 64;19 else if (c == '-')20 loc = 65;21 else if (c == '+')22 loc = 66;23 return loc;24 }25 26 int vis_word(char c) {27 int loc = 0;28 if (c >= 'a' && c <= 'z')29 loc = c - 97 + 26;30 else if (c >= 'A' && c <= 'Z')31 loc = c - 39 - 26;32 return loc;33 }34 35 int main() {36 bool vis[67] = { false };37 string injure;38 string instr;39 getline(cin, injure);40 getline(cin, instr);41 for (int i = 0; i < injure.size(); i++) {42 if (injure[i] == '+') {43 vis[66] = true;44 for (int j = 26; j < 52; j++)45 vis[j] = true;46 }47 else {48 if (injure[i] >= 'a' && injure[i] <= 'z')49 vis[vis_word(injure[i])] = true;50 else if (injure[i] >= 'A' && injure[i] <= 'Z')51 vis[vis_word(injure[i])] = true;52 vis[vis_loc(injure[i])] = true;53 }54 }55 for (int i = 0; i < instr.size(); i++) {56 if (!vis[vis_loc(instr[i])])57 cout << instr[i];58 }59 cout << endl;60 61 return 0;62 }

 

转载于:https://www.cnblogs.com/moujun1001/p/9494809.html

你可能感兴趣的文章
常用的 Python 标准库都有哪些?
查看>>
新手学PHP必看
查看>>
收藏收藏,赶紧的。
查看>>
java中的基本算法
查看>>
appium安装
查看>>
List指定字段赋特定值(非循环) asp.net
查看>>
linux中批量改名
查看>>
2个浏览器窗口间通信
查看>>
docker (centOS 7) 使用笔记3 - 修改docker默认的虚拟网址
查看>>
136. Single Number (Bit)
查看>>
win10环境下mysql5.7压缩包解压安装过程
查看>>
hud 2586 How far away ?
查看>>
JNI NewString
查看>>
QTP日期控件
查看>>
Linux:Ubuntu 14.04 Server 离线安装Jjava8(及在线安装)
查看>>
KMP算法介绍总结
查看>>
eclipse package,source folder,folder区别及相互转换
查看>>
代理模式
查看>>
MySQL数据类型
查看>>
处理date类型对象的方式
查看>>