前言

在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]={NULL};
	cin.getline(array,20); //或者指定结束符,使用下面一行
	//cin.getline(array,20,'\n');
	cout<<array<<endl;
	return 0;
}
  • cin.getline()cin.get() 的区别是,cin.getline() 会将结束符(如换行符)从输入缓冲区中删除。

5. getline() 读取一行

函数原型:

istream& getline (istream& is, string& str);	// 默认以换行符\n分隔行
istream& getline (istream& is, string& str, char delim);
#include <string> 
#include <iostream>
using namespace std;

int main() {
	string str;
	getline(cin,str);
	cout << str << endl;
	return 0;
}
  • getline() 遇到结束符时,会将结束符一并读入指定的 string 中,再将结束符替换为空字符;
  • cin.getline()getline() 类似,但是因为 cin.getline() 的输出是char*getline() 的输出是 string,所以 cin.getline() 属于 istream 流,而 getline() 属于 string 流,二者是不一样的函数。

三、牛客网OJ在线编程输入输出练习十一题

第一题:计算多组a+b

#include<bits/stdc++.h>
using namespace std;
int add(int num1, int num2){
    return num1 + num2;
}

int main(){
    int a, b;
    while(cin>>a>>b){
        cout<<add(a, b)<<endl;
    }
    return 0;
}

第二题:告知多少组,计算多组a+b

#include<bits/stdc++.h>
using namespace std;
int add(int a, int b){
    return a + b;
}

int main(){
    int t, a, b;
    cin>>t;
    while(cin>>a>>b){
        cout<<add(a, b)<<endl;
    }
    return 0;
}

第三题:如果a、b都不为0,计算多组a+b

#include<bits/stdc++.h>
using namespace std;
int add(int num1, int num2){
    return num1 + num2;
}

int main(){
    int a, b;
    while(cin>>a>>b){
        if(a == 0 && b == 0) break;
        cout<<add(a, b)<<endl;;
    }
    return 0;
}

第四题:计算一系列数的和(第一个数为0时结束)

#include<bits/stdc++.h>
using namespace std;

int main(){
    int n;
    while(cin>>n){
        if(n == 0) break;
        else{
            int sum = 0;
            while(n--){
                int a;
                cin>>a;
                sum += a;
            }
            cout<<sum<<endl;
        }
    }
    return 0;
}

第五题:计算一系列数的和(告知一共有几组)

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
    cin>>n;
    while(n--){
        int m;
        cin>>m;
        int sum = 0;
        while(m--){
            int num;
            cin>>num;
            sum += num;
        }
        cout<<sum<<endl;
    }
    return 0;
}

第六题:计算一系列数的和(不告知几组和何时结束,每一组第一个数为一共本组几个数)

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
    while(cin>>n){
        int sum = 0;
        while(n--){
            int num;
            cin>>num;
            sum += num;
        }
        cout<<sum<<endl;
    }
    return 0;
}

第七题:计算一系列数的和(一行一组,不告诉一组几个,需要判断)

#include<bits/stdc++.h>
using namespace std;
int main(){
    int num, sum;
    while(cin>>num){
        sum += num;
        if(cin.get() == '\n'){
            cout<<sum<<endl;
            sum = 0;
        }
    }
    return 0;
}

第八题:字符串排序(只排一组,告诉有几个)

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n;
    cin>>n;
    vector<string> str;
    for(int i = 0; i < n; i++){
        string s;
        cin>>s;
        str.push_back(s);
    }
    sort(str.begin(), str.end());
    for(int i = 0; i < n; i++){
        cout<<str[i];
        if(i != n - 1) cout<<' ';
    }
    return 0;
}

第九题:字符串排序(排列多组,有结束符)

#include<bits/stdc++.h>
using namespace std;
int main(){
    string s;
    vector<string> str;
    while(cin>>s){
        str.push_back(s);
        if(cin.get() == '\n'){
            sort(str.begin(), str.end());
            for(int i = 0; i < str.size(); i++){
                cout<<str[i];
                if(i != str.size() - 1) cout<<' ';
            }
            cout<<endl;
            str.clear();
        }
    }
    return 0;
}

第十题:字符串排序(输入用逗号分开)

#include<bits/stdc++.h>
using namespace std;
int main(){
    string s;
    getline(cin, s);
    while(s.size()){
        vector<string> str;
        int begin = 0;
        for(int i = 0; i < s.size(); i++){
            if(s[i] == ','){
                str.push_back(s.substr(begin, i - begin));
                begin = i + 1;
            }
        }
        str.push_back(s.substr(begin, s.size() - begin));
        
        sort(str.begin(), str.end());
        
        for(int i = 0; i < str.size(); i++){
            cout<<str[i];
            if(i != str.size() - 1) cout<<',';
        }
        cout<<endl;
        getline(cin, s);
    }
    return 0;
}

第十一题:长整型求和

#include<bits/stdc++.h>
using namespace std;
long add(long a, long b){
    return a + b;
}

int main(){
    long a, b;
    cin>>a>>b;
    cout<<add(a, b);
    return 0;
}