//C++Primer Plus的学习笔记
对当前学到的知识进行总结:(有遗漏和缺点,不足之处请指正.)
尽量避免两个行输入函数同时写。
我们常见的行输入函数有:
1.scanf()(一般VS里不使用不讲)
缺点:无边界,可能导致数据不安全
2.scanf_s()(参数是:“%s”,字符串名,限制读入个数)少输后面那个参数,莫非默认值是0,总之无输出。
一般运行代码:
char s1[10];
scanf_s("%s",s1,10);
函数特性:
输入字符串 识别空格处或回车换行或到达读取字符限制数量处为字符串尾,自动添加‘\0’读入。(这估计是%s这个输入格式的特性)
将剩余的字符放入流。
代码如下:
const int Arraysize=10;
char s1[Arraysize],s2[Arraysize];
scanf_s("%s",s1,10);
scanf_s("%s",s2,10);
cout<<s1<<endl;
cout<<s2<<endl;
会出现这样的结果:
输入 Hello Milk
输出Hello
Milk (自动读取了存在流中的字符串)
3.cin.getline() (参数是:字符串名,限制读入个数)少写参数报错。
函数特性:
只在到达限制读取个数或ENTER的换行符后才停止读取。
与scanf_s相比两个getline函数前后不会出现读错,或信息遗漏等问题。(好用)
4.cin.get() (参数是:字符串名,限制输入个数) 不带参数可以用于读取下一个字符就像_getch(),少写参数报错.
函数特性:
遇到Enter输入的换行符时或达到了限制输入个数结束读取,但将换行符留在输入队列中...不过比scanf_s好的一点是,可以输入空格。
问题代码:
const int Arraysize=10;
char s1[Arraysize],s2[Arraysize];
cin.get(s1,10);
cin.get(s2,10);
cout<<s1<<endl;
cout<<s2<<endl;
会出现这样的结果:
输入:
hello milk (仅能输入一次)
输出:
hello milk
并用的时候第一个get()遗留的换行符使第二个get()停止了工作。
解决方法:
中间可用cin.get()来吸收该换行符 可拼接模式在同一个类下:cin.get(s1,10).get().get(s2,10);效果相同。