与string类有关的cin&getline(cin,string)输入输出实例分析与反思
前言:
主要是写代码的时候有几个不清楚的地方,一个一个试了一下,并用文字分析了下(脑袋有点晕,写出来不容易出错)。又截了图,那就顺便发出来了吧hhhh。
正文:
本文的行文逻辑就是分析代码(using example),搞懂输入和输出是怎么对应上的,最后给出防止问题产生的方法和知识点总结。
example1(本文用 ’*‘代替空格,便于辨认)

注意cin、getline的顺序。
example2

code1和2只有cin和getline的顺序变动了一下,结果也很好理解。(不解释啦)
然后问题其实和下面的几个代码有关。
example3(和example的code一样,但输入不同)

是的没错,你敲完\n(也就是回车),程序就结束了。
!!!也就是说先用cin再用getline会出现问题。
解释:cin遇到空格或\n结束会语句,同样的,getline遇到\n会结束语句。
流程:输入12\n后,cin读取12,cin读取\n,cin停止(\n并没有消失)。getline读取\n,getline停止。
为了防止example3这种情况的出现,我们需要加一行getchar();具体见下文代码。
example4

很正常吧?输入完123回车,在输入abc。输出也很normal。
解释:
输入完123后,理所当然的想用回车来结束输入,于是cin结束了(\n仍然存在),紧接着getchar读取了\n(\n消失了!),然后getline并没有看到\n于是读取了abc。
example5(code3,输入和example3的输入类似)

可以和example3不见getchar的代码进行对比,效果拔群!
不论怎么输入都会得到想要的结果。
解释:
当输入完123后输入空格时cin读取到空格结束,同时空格本身不会消失,然后空格被getchar读取,接着到getline读取(读取了abc)。
什么?这些分析和改进有什么dia用?下面是我写题涉及到的部分代码,主要是红框内容。


拿下!!

结尾:
稍微总结一下
cin遇到空格或回车结束,会保留遇到的空格或回车
getline(cin,string)遇到回车停止。(人家叫getline,读取一行(line),很合理吧)
getchar()读取一个字符(当然包括空格和\n了)
cin紧接着getline会出bug,两者间需要添加getchar()。