cin的使用方法

c++输入输出概述、常见的输入方法cin、cin.get()读取一个字符、cin.get()读取一行、cin.getline()读取一行。

cin的使用方法

c++输入输出概述

流与缓冲

  • C++程序将输入和输出看作字符流;对于输入来说,程序从输入流中抽取字符,对于输出来说,程序向输出流中插入字符;
  • 输入流可以来自键盘、存储设备或者其他程序;输出流可以输出至显示器、打印机、存储设备或者其他程序。
  • 流是程序与流源或流目的之间的中介,这样C++就可以对来源不同的字符做相同处理。
  • 缓冲区就是一块存储空间,它是为了匹配程序处理速度和外设处理速度;比如程序一次处理1byte,但是磁盘一次读取512bytes;又或者程序一次处理1byte,可以1byte地从磁盘读取,但是由于硬件读取一次数据复杂且操作慢,因此使用缓冲区可以加快程序处理速度。flushing the buffer:刷新缓冲区就是清空缓冲区地内容以备下次使用。

相关类

  • streambuf:提供缓冲区,有成员方法 填满缓冲区、获取缓冲区内容、刷新缓冲区、管理缓冲区
  • ios_base:表示流的一般属性 比如文件是否打开、是二进制流还是文本流等等
  • ios:基于ios_base,并且它包含了一个指针成员指向一个streambuf对象
  • ostream:继承自ios类并提供了输出方法
  • istream:继承自ios类并提供了输入方法
  • iostream:继承自ostream类和istream类

常见的输入方法

cin >>

cin略过空白符(空白、新行、tabs)直到它遇到非空白符。

当 cin >> 从缓冲区中读取数据时,若缓冲区中第一个字符是空格、tab或换行这些分隔符时,cin >> 会将其忽略并清除,继续读取下一个字符,若缓冲区为空,则继续等待。但是如果读取成功,字符后面的分隔符是残留在缓冲区的,cin >> 不做处理。

1
2
3
4
5
6
7
8
9
10
11
12
13
#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[enter]11[enter]12.3[enter]

1
2
3
4
5
a
11
12.3
// output
a 11 12.3

cin.get()

该函数有多种重载形式,分为四种格式:无参,一参数,二参数,三个参数。常用的的函数原型如下:

1
2
3
4
5
int get();
istream& get(char& var);
istream& get( char* s, streamsize n );
istream& get( char* s, streamsize n, char delim);

cin.get()读取一个字符

读取一个字符,可以使用 cin.get() 或者 cin.get(var)

1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
using namespace std;

int main() {
char a;
char b;
a=cin.get();
cin.get(b);
cout << a << b <<endl;
return 0;
}

1
2
3
e //input
e //output

  1. 从结果可以看出,cin.get() 从输入缓冲区读取单个字符时不忽略分隔符,直接将其读取,就出现了如上情况,将换行符读入变量 b,输出时换行两次,一次是变量 b,一次是 endl。
  2. cin.get() 的返回值是 int 类型,成功则返回读取字符的 ASCII 码值。
  3. cin.get(char var) 如果成功返回的是 cin 对象,因此支持链式操作,如cin.get(b).get(c)。

cin.get()读取一行

函数原型:

1
2
3
istream& get(char* s, streamsize n)
istream& get(char* s, size_t n, streamsize delim)

二者的区别是前者默认以换行符结束,后者可指定行结束符。n 表示目标空间的大小。

例子:

1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
using namespace std;

int main() {
char a;
char array[20];
cin.get(array,20);
cin.get(a);
cout<<array<<" "<<(int)a<<endl;
return 0;
}

  1. 从结果可以看出,cin.get(array,20)读取一行时,遇到换行符时结束读取,但是不对换行符进行处理,换行符仍然残留在输入缓冲区。第二次由 cin.get() 将换行符读入变量 b,打印输入换行符的 ASCII 码值 10。这也是 cin.get() 读取一行与使用 cin.getline 读取一行的区别所在。cin.getline 读取一行字符时,默认遇到 ‘\n’ 时终止,并且将 ‘\n’ 直接从输入缓冲区中删除掉,不会影响下面的输入处理。
  2. cin.get(str,size); 读取一行时,只能将字符串读入 C 风格的字符串中,即 char*,但是 cin.getline() 函数可以将字符串读入C++ 风格的字符串 string中。鉴于 cin.getline() 较 cin.get() 的这两种优点,建议使用 cin.getline() 读取行。

cin.getline()读取一行

从标准输入设备键盘读取一串字符串,并以指定的结束符结束。

函数原型:

1
2
3
istream & getline(char* s, streamsize count); //默认以换行符结束
istream & getline(char* s, streamsize count, char delim);

cin.getline() 不会将行结束符(如换行符)残留在输入缓冲区中。


引用链接:


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!