以前做题的时候,往往在一些输入上很讲究,但是当时对cin,scanf 和getline的用法不是很清楚,弄的束手无策,
结果去google,百度,讲的也不是特别的详细,经过自己的研究,终于弄懂了这些的用法,先上一道题吧,真是水题,这种就是在输入上做文章
题目: 输入为字典对应,前面的是value,后面的是key,空一行,接着是查询key,输出为key所对应的value,
如果不存在则输出为eh。如图。
这道题目还是比较简单的,只是对于输入来说是个难点,因为不知道何时输入结束,虽说空了一行,但是如果对于cin,scanf,getline等函数不熟的话,在写代码的时候会遇到很多问题,熟的话,几分钟搞定这道题。
之所以我想写这篇文章,是因为我看了一些百度文库后发现里面的讲的并不是完全正确。
先说说scanf吧,如果是读字符的话,任何字符它都是会读取的。看一个例子:
#include <iostream>
#include <cstdlib>
#include <string>
using namespace std;
int main() {
int a, b;
char c1, c2, c3;
string str;
scanf("%c%c%c",&c1, &c2, &c3);
cout << c1 << c2 << c3;
system("pause");
return 0;
}
我输入的是 空格 + 1 + 回车 ,结果输出的也是空格 + 1 + 回车,可见scanf读取字符的时候是通吃的。
cin.get()是读取单个字符的和scanf读取单个字符是完全一样的,也是通吃型的。
再说scanf读取字符串的情况:
#include <iostream>
#include <cstdlib>
#include <string>
using namespace std;
int main() {
int a, b;
char c1, c2, c3;
char str1[10], str2[10], str3[10];
scanf("%s%s%s", str1, str2, str3);
c1 = cin.get();
cout << str1 << str2 << str3;
cout << c1;
system("pause");
return 0;
}
我输入的是 空格 + 111 + 空格 + 222 + 空格 + 333 + 回车,结果输出是 111222333+回车 ,这说明scanf读取字符串的时候,从第一个非空白字符开始读取,直到遇到空白字符结束,但是它并不会读入空白字符,也就是说,最后的
的回车符他是没读取进去的也不会丢掉,结果用cin.get()读取赋值给了c1。
cin读取字符串的用法跟scanf读取字符串的方式是一样的。
getline是读取整行字符串的(开头的空白字符也会照样读取),我们关心的是它到底有没有读取最后的换行符,来看一个例子:
#include <iostream>
#include <cstdlib>
#include <string>
using namespace std;
int main() {
int a, b;
char c1, c2, c3;
string s;
getline(cin,s);
cout << s;
c1 = cin.get();
cout << c1;
system("pause");
return 0;
}
我输入输入 1111111 + 回车 结果是输出 1111111 后面还在等待输入(c1=cin.get() ),由此可知,换行符是被读取掉了,并且丢掉了
下面在说说读取的机制,看到网上说有一段缓冲区,保存着从键盘输入的字符,那究竟从什么时候cin,scanf这些从缓冲区读取呢?答案应该是你输入回车的时候。看看一个例子:
#include <iostream>
#include <cstdlib>
#include <string>
using namespace std;
int main() {
string s;
while (1) {
cin >> s;
cout << s;
}
system("pause");
return 0;
}
我输入的是 111 + 222 + 333 + 回车 接着它就输出 111222333,我在输入空格 + 4444 + 回车,它输出 4444 ,由此证明观点是正确的。
说到这里,我想第一题应该很容易就可以做出来了。
总结一下:
scanf | 读取单个字符的时候,是通吃型的,空白字符也会读取;读取字符串的时候,从第一个非空白字符读起,遇到空白字符结束,不读入空白字符 |
cin | cin.get()和scanf读取单个字符是一样的,cin读取单个字符时,从非空白字符读起,遇到空白字符结束,不读入空白字符;读取字符串时,从非空白字符读起,遇到空白字符结束,不读入空白字符 |
getline | 读取整行的字符串,开头的空白字符也会读取,遇到行尾结束,行尾的回车符也会读取掉,并且丢弃掉了 |
以上纯属自己百度google之后,总结出来的经验。有问题望大家提出。