基础语法之“读入输出”

基本介绍

在 C++ 读入有两种流派,第一种是 C++ 新出品的 cin/cout 代表的 IOS 流派。第二种是传承自 C 语言的 scanf/printf 代表的旧语法流派。当然还有一些人会使用 快读/快写 等高速读入方式,后面的文章会提及。

IOS 流派

  • 读入

    一般来讲,在新手入门时,推荐使用$cin$来读入,其格式类似于:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include<bits/stdsc++.h>
    #include<iostream>
    // iostream 是包含 cin/cout 的头文件,当然包括在万能头里,所以如果引用了万能头,就不必担心用不了 cin/cout 了
    using namespace std;
    // 另外,cin/cout 还依赖于 C++ 新出的 std 库,也就是说我们必须引用 std 命名空间才可以,就是上面那一句话,不然的话我们要在所有和 std 有关的工具前面加上 std:: 这是命名空间的引用方式,以后的文章也会提及,举个例子,如果没有引用 std 库,那么 cin/cout 会变成 std::cin/std::cout
    int main(){
    cin>>...//要输入的内容
    return 0;
    }

    在这里,如果你要输入一个变量,比如我们新建一个变量$a$ 。那么,我们要在 $>>$ 后面输入变量名,即$>>a$

    这样就可以读入单个变量了!


    如果读入的对象超出一个,那么我们该怎么办呢?

    1.

    ​ 第一种方法便是使用 Ctrl + C 来把 $cin>>$ 多复制几次,就可以了。比如我们读入两个变量 $a, b$ ,那么代码就是这样:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include<bits/stdc++.h>
    using namespace std;

    int a, b;

    int main(){
    cin>>a;
    cin>>b;
    return 0;
    }

    2.

    如果你担心你的 Ctrl 被按坏,那就用第二种方法第二种方法是在 $>>a$ 后面再加一个 $>>b$ ,这样也能做到相同的效果。代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include<bits/stdc++.h>
    using namespace std;

    int a, b;

    int main(){
    cin>>a>>b;
    return 0;
    }
  • 输出

    与读入相似,对于初学者用来输出的便是 $cout$ ,格式如下:

    1
    >cout<<...;

    在这里要注意,在 $cin$ 中,我们不需要在 $<<$ 后面增加多余的符号(除了变量),但在 $cout$ 中,你 需要增加 多余的符号。

    下列是几种类型以及要增加的变量:

    | 单个变量 | 变量之间相加减 | 单个字符 | 多个字符 |
    | :———: | :——————: | :———-: | :———: |
    | 无添加 | 无添加 | 增加 '' | 增加"" |

    下面我们针对单个字符和多个字符进行举例子大法:

    1. 单个字符

    如果我们要输出一个 $a$ ,那么我们就可以这样:

    1
    >cout<<'a';

    这样就可以输出 $a$ 了!

    2. 多个字符

    如果我们要输出 $Hello$ $ world!$​ ,那么我们就要这样:

    1
    >cout<<"Hello world";

以上就是IOS流派的全部内容了。

旧语法流派

接下来,就是万众瞩目的——旧语法流派!

  • 读入

    在基本介绍中我们就有提过 scanf/printf 这个基础格式,那么,我们就来正式的说明一下。我们先来看看读入。

    cin 不同, scanf 有着不同的输入格式,但速度更快,推荐在新手期结束后使用。其格式类似于:

    1
    2
    3
    4
    5
    6
    #include<bits/stdc++.h>
    using namespace std;
    int main(){
    scanf("%...", &...);
    return 0;
    }

    很明显,使用scanf来读入分为三部分,我们一部分一部分的讲。

    1.

    首先是基础的模板,即 scanf("% ", &);% 后面是变量的类型,& 后面是变量名。

    2.

    在信息学基础的时候,我们主要有5大类型,下列表格是各种类型 % 后面的字母。

整形变量(int) 整形变量(long long) 双精度浮点数(double) 字符型变量(char,单个) 字符型变量(char,多个)
%d %lld %lf %c %s

3.

最后一部分只用把你的变量名写在 & 后面就可以了!

  • 输出

    printfscanf 几乎一样,但是有一点要注意:printf没有 & ! 。格式如下:

    1
    printf("%...", ...);

    但这只是变量的输出,如果你要输出像 $Hello$ $world!$ 之类的字符,那要怎么办呢?

    字符的输出:

    ​ 我们只需要在 "" 里打入你想要输入的字符便可,比如输出Hello world ,我们就可以这么写:

    1
    printf("Hello world");//由于我们不需要输出变量,所以我们可以不用写后面的东西

以上就是旧语法流派的全部内容了。

FastIO 流派

如果将你追求极致的速度,那么 FastIO 流派就可以满足你的要求。此流派针对高手

  • 快读

    众所周知, getchar 有着极快的速度,所以说,我们可以手打一个函数来解决这个问题。

    1
    2
    3
    4
    5
    6
    inline void read(unsigned long long &a){
    a=0; char c;
    while((c=getchar())<48);
    do a=a*10+(c^48);
    while((c=getchar())>47);
    }

    以上内容可以把不大于 2^64^的数快速读入。下面我来说一下它的工作原理:

    1. 它首先将 a 初始化为0。
    2. 使用 getchar() 函数获取字符,并检查是否小于48,即判断是否为数字字符的开始。
    3. 当遇到第一个数字字符时,通过异或操作 (c^48) 将其转换成对应的数值(例如,如果c是’5’,那么c^48就是5-48=7)。
    4. 然后将这个数值加到 a 上。*10 表示乘以10,因为每次循环都是当前值加上下一个数字的十位值。
    5. 接着继续循环,直到读取到非数字字符(大于47,因为ASCII码47对应于’/‘),这时结束循环。

    总之,这个函数用于逐位读取用户输入的无符号长整数并存储在 a 中。

    但如果你想读入任何东西,那就需要517Group的终极快读:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    namespace FastIO 
    {
    // char buf[1 << 20], *p1, *p2;
    // #define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 20, stdin), p1 == p2) ? EOF : *p1++)
    template<typename T> inline T read(T& x) {
    x = 0;
    int f = 1;
    char ch;
    while (!isdigit(ch = getchar())) if (ch == '-') f = -1;
    while (isdigit(ch)) x = (x << 1) + (x << 3) + (ch ^ 48), ch = getchar();
    x *= f;
    return x;
    }
    template<typename T, typename... Args> inline void read(T& x, Args &...x_) {
    read(x);
    read(x_...);
    return;
    }
    inline ll read() {
    ll x;
    read(x);
    return x;
    }
    };
    using namespace FastIO;

    以上代码就可以读入任何东西,十分强大。

以上就是基础语法之“读入输出”的全部内容了,感谢大家的阅读。