一.cin的常见读取方法
Ⅰ.cin>>
- cin 可以连续从键盘读取想要的数据,以空格、tab 或换行作为分隔符。
- 当 cin>> 从缓冲区中读取数据时,若缓冲区中第一个字符是空格、tab或换行这些分隔符时,cin>> 会将其忽略并清除,继续读取下一个字符,若缓冲区为空,则继续等待。但是如果读取成功,字符后面的分隔符是残留在缓冲区的,cin>> 不做处理
#include <iostream>
using namespace std;
int main()
{
char a;
int b;
float c;
cin>>a>>b>>c;
cout<<a<<" "<<b<<" "<<c<<" "<<endl;
return 0;
}
输入【回车 回车 a 回车11 回车 3.14】输出结果如下
a 11 3.14
Ⅱ.cin.get()
1. 读取一个字符,可以使用 cin.get() 或者 cin.get(var)
#include <iostream>
using namespace std;
int main()
{
char a;
char b;
a=cin.get();
cin.get(b);
cout << a << b <<endl;
return 0;
}
输出
e
e
请输入任何键以继续...
(1)从结果可以看出,cin.get() 从输入缓冲区读取单个字符时不忽略分隔符,直接将其读取,就出现了如上情况,将换行符读入变量 b,输出时换行两次,一次是变量 b,一次是 endl。
(2)cin.get() 的返回值是 int 类型,成功则返回读取字符的 ASCII 码值。
(3)cin.get(char var) 如果成功返回的是 cin 对象,因此支持链式操作,如cin.get(b).get©。
2. 读取一行
#include <iostream>
using namespace std;
int main()
{
char a;
char array[20]={NULL};
cin.get(array,20);
cin.get(a);
cout<<array<<" "<<(int)a<<endl;
return 0;
}
输出
123456789
123456789 10
(1)从结果可以看出,cin.get(array,20);读取一行时,遇到换行符时结束读取,但是不对换行符进行处理,换行符仍然残留在输入缓冲区。第二次由cin.get()将换行符读入变量b,打印输入换行符的ASCII码值为10。这也是cin.get()读取一行与使用getline读取一行的区别所在。getline读取一行字符时,默认遇到’\n’时终止,并且将’\n’直接从输入缓冲区中删除掉,不会影响下面的输入处理。
(2)cin.get(str,size);读取一行时,只能将字符串读入C风格的字符串中,即char*,但是C++的getline函数可以将字符串读入C++风格的字符串中,即string类型。鉴于getline较cin.get()的这两种优点,建议使用getline进行行的读取。
Ⅲ.cin.getline()
#include <iostream>
using namespace std;
int main()
{
char array[20]={NULL};
cin.getline(array,20); //或者指定结束符,使用下面一行
//cin.getline(array,20,'\n');
cout<<array<<endl;
return 0;
}
注意,cin.getline() 与 cin.get() 的区别是,cin.getline() 不会将行结束符(如换行符)残留在输入缓冲区中
二.从标准输入读取一行字符串的其它方法
Ⅰ.getline()
C++ 中定义了一个在 std 名字空间的全局函数 getline(),因为这个 getline() 函数的参数使用了 string 字符串,所以声明在了头文件中了。
getline() 利用 cin 可以从标准输入设备键盘读取一行,当遇到如下三种情况会结束读操作:
(1)文件结束;
(2)遇到行分隔符;
(3)输入达到最大限度
#include <string>
#include <iostream>
using namespace std;
int main()
{
string str;
getline(cin,str);
cout << str << endl;
return 0;
}
hello world
hello world
注意,getline() 遇到结束符时,会将结束符一并读入指定的 string 中,再将结束符替换为空字符。因此,进行从键盘读取一行字符时,建议使用 getline,较为安全。但是,最好还是要进行标准输入的安全检查,提高程序容错能力。
cin.getline() 与 getline() 类似,但是因为 cin.getline() 的输出是char*,getline() 的输出是 string,所以 cin.getline() 属于 istream 流,而 getline() 属于 string 流,二者是不一样的函数。
Ⅱ.gets()
gets() 是 C 中的库函数,在头文件 <stdio.h> 申明,从标准输入设备读字符串,可以无限读取,不会判断上限,以回车或者文件结束符 EOF( 即 -1) 结束,所以程序员应该确保 buffer 的空间足够大,以便在执行读操作时不发生溢出。Windows 下命令行输入文件结束符 EOF 的方式为 Ctrl+z,Linux 为 Ctrl+d
#include <iostream>
using namespace std;
int main()
{
char array[20]={NULL};
gets(array);
cout << array << endl;
return 0;
}
hello world
hello world
由于该函数是 C 的库函数,所以不建议使用
转载自
https://blog.csdn.net/K346K346/article/details/48213811