前言
在LeetCode上刷题刷习惯了后,参加各种笔试时没想到遇到的第一只拦路虎竟是输入输出!如果对输入输出操作不熟练,就会笔试中耽误大量时间,挤占答题时间,从而与offer失之交臂。故,今天抽时间好好整理一番,顺带给出牛客网输入输出十一题的题解。
一、基础
cin
是 C++ 标准输入流对象,即 istream
类的对象。主要用于从标准输入读取数据,这里的标准输入指键盘。cin
的工作原理依赖于标准输入缓冲区,从键盘输入字符串的时候需要敲一下回车键才能够将这个字符串送入到缓冲区中。敲入的这个回车键 \r
会被转换为一个换行符 \n
,这个换行符也会被存储在缓冲区中并且被当成一个字符。
cin
从缓冲区中获取数据,缓冲区为空时,cin
的成员函数会陷入阻塞并等待数据,一旦缓冲区中有数据,就触发 cin
的成员函数去读取。
二、常用的输入方法
1. cin>>
通过 cin>>
可以连续从键盘读取数据,其中空格、tab 或换行被视为分隔符。
#include <iostream>
#include <string>
using namespace std;
int main() {
char c;
int i;
float f;
string str;
cin>>c>>i>>f>>str;
cout<<c<<" "<<i<<" "<<f<<" "<<str<<endl;
return 0;
}
- 当
cin>>
从缓冲区中读取数据时,若缓冲区中第一个字符是空格、tab或换行符这些分隔符时,cin>>
会忽略并将其清除,继续读取下一个字符;若缓冲区为空,则继续等待。如果读取成功,字符后面的分隔符会残留在缓冲区。
2. cin.get()读取一个字符
函数原型:
int get();//无参
istream& get(char& var);
使用方式:
#include <iostream>
using namespace std;
int main() {
char a;
char b;
a = cin.get();
cin.get(b);
cout<<a<<b<<endl;
return 0;
}
cin.get()
从输入缓冲区读取单个字符时不忽略分隔符,直接将其读取(即变量存储分隔符);cin.get()
的返回返回读取字符的 ASCII 码;cin.get(char var)
返回cin
对象本身,因此支持链式操作,如cin.get(b).get(c)
。
3. cin.get()读取一行
函数原型:
istream& getline(char* s, streamsize count);
istream& getline(char* s, streamsize count, char delim);//delim 为结束符
#include <iostream>
using namespace std;
int main() {
char c;
char array[20]={
NULL};
cin.get(array,20);
cin.get(c);
cout<<array<<" "<<(int)c<<endl;
return 0;
}
- 遇到换行符时结束读取,但是不对换行符进行处理,换行符仍然残留在输入缓冲区。这也是
cin.get()
读取一行与使用cin.getline()
读取一行的主要区别。cin.getline()
读取一行字符时,默认遇到\n
时终止,并且将\n
直接从输入缓冲区中删除,不会影响下面的输入处理。
4. cin.getline() 读取一行
函数原型:
istream& getline(char* s, streamsize count);
istream& getline(char* s, streamsize count, char delim);//delim结束符
#include <iostream>
using namespace std;
int main() {
char array[20]