题目
题目地址:
题解
本题一直有一分的样例点过不了,原因在于用了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 #include2 #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 }