PAT 乙级 1033
题目
题目地址:PAT 乙级 1033
题解
本题一直有一分的样例点过不了,原因在于用了cin接收输入的字符……
问题在于:如果用cin输入,无法接收无坏键的情况的输入,需要getline作为输入;这就涉及到cin和getline的不同,这一部分我看到一篇博文写得很好,就直接粘过来,先贴出原博文的地址:https://www.cnblogs.com/YTYMblog/p/5930692.html
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 <iostream> 2 #include <string> 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 }