(VS2012)C++行输入函数的使用(scanf_s,cin.getline,cin.get)

来源:互联网 发布:mac杀毒软件哪个好用 编辑:程序博客网 时间:2024/03/29 00:43

//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);效果相同。