NO.31十六届蓝桥杯备战|输入时的特殊技巧|scanfprintf和cincout对比|ios::sync_with_stdio|cin.tie(0)(C++)

含空格字符串的特殊处理方式

根据我们现在掌握的知识,含空格的字符串,如要读取有 fgets 、 scanf 、getchar 、 getline 四种⽅式解决,但是有时候,根据题⽬的情况,不⼀定⾮要完整的读取这个带空格的字符串,⽽是将字符串中空格隔开的每⼀个字符串,当做⼀个单词处理更⽅便,也避免了读取带空格字符串的各种问题。

B2109 统计数字字符个数 - 洛谷
#include <bits/stdc++.h>
using namespace std;

const int N = 265;
char a[N] = {0};

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    string s;
    getline(cin, s);
    int cnt = 0;
    for (auto e : s)
    {
        if (isdigit(e))
            cnt++;
    }
    cout << cnt << endl;
    
    return 0;
}
#include <bits/stdc++.h>
using namespace std;

const int N = 265;
char a[N] = {0};

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    string s;
    int cnt = 0;
    while (cin >> s)
    {
        for (auto e : s)
        {
            if (isdigit(e))
                cnt++;
        }  
    }

    cout << cnt << endl;
    
    return 0;
}

数字的特殊处理⽅式

当我们程序运⾏的时候,在控制台输⼊ 123 的时候,这时的 123 是三个字符, 123 是⼀个字符序列,程序会根据代码中的数据类型,可能将 123 解析成整型,也可能将 123 解析成字符串

int num = 0;  
cin >> num;//输⼊123, 就被解析成整数  
string s;  
cin >> s; //输⼊123, 就被解析成字符串

这⾥的解析的⽅式,主要是依赖编译器对变量类型的识别,根据类型再将读取字符串数据转化成对应类型的数据。
我们在写代码的时候,应该根据实际的情况,来决定如何处理输⼊的内容

小乐乐改数字_牛客题霸_牛客网
#include <iostream>
#include <cmath>
using namespace std;
  
int main() {
    int n;
    cin >> n;
    int i = 0;
    int ret = 0;
    while (n)
    {
        if (n % 10 % 2)
            ret += 1 * pow(10, i);
        //else
        //    ret += 0 * pow(10, i);
        n /= 10;
        i++;
    }
    cout << ret << endl;
    
    return 0;
}
#include <iostream>
#include <cmath>
using namespace std;
  
int main() {
    string s;
    cin >> s;
    int i = 0;
    for (i = 0; i < s.size(); i++)
    {
        if (s[i] % 2)
            s[i] = '1';
        else
            s[i] = '0';
    }
    cout << stoi(s) << endl;
  
    return 0;
}

scanf/printf和cin/cout的对⽐

scanf 和 printf 是C语⾔中的标准输⼊输出函数,⽽ cin 和 cout 是C++语⾔中的标准输⼊输出流对象。它们各⾃有优缺点,整体上来说 cin 和 cout 会更加⽅便,但有时候我们也不得不使⽤ scanf 和 printf 。

格式控制差异
  • scanf 和 print
### 代码作用 - `std::ios::sync_with_stdio(false)`:这是 C++ 中的一个配置设置,用于控制标准 I/O 流(如 `std::cin`、`std::cout`)的行为。默认情况下,C++ 的标准输入输出流(`std::cin` `std::cout`)与 C 语言的标准输入输出函数(如 `scanf` `printf`)是同步的,这意味着在使用 C++输入输出流,会保证与 C 语言的输入输出函数的调用顺序一致。但这种同步会带来一定的性能开销,因为每次调用 C++ 输入输出流都需要进行一些额外的检查。使用 `std::ios::sync_with_stdio(false)` 可以关闭这种同步,让 `std::cin` `std::cout` 的效率接近于 `scanf` `printf`,从而优化输入输出操作的性能,尤其是在处理大量数据效果更明显 [^1][^4]。 - `std::cin.tie()`:在默认情况下,`std::cin` 绑定的是 `std::cout`,每次执行 `<<` 操作符的候都要调用 `flush`,这样会增加 I/O 负担。`std::cin.tie(nullptr)` (通常传入 `nullptr` 来解除绑定)的作用是解除 `std::cin` `std::cout` 的绑定,进一步提高输入输出的效率。不过如果调用 `std::cin.tie()` 不传入参数,它实际上是返回当前与 `std::cin` 绑定的流的指针,一般我们会使用 `std::cin.tie(nullptr)` 来达到解除绑定的目的 [^1][^5]。 ### 使用场景 - **处理大量输入输出数据**:当程序需要处理大量的数据输入输出,使用 `std::ios::sync_with_stdio(false)` `std::cin.tie(nullptr)` 可以显著提高程序的运行效率。例如,在进行大数据文本处理、算法竞赛等场景中,能够节省大量间 [^1][^4]。 - **对程序性能有较高要求**:对于一些对性能要求极高的程序,即使输入输出的数据量不是特别大,也可以使用这两个设置来优化程序性能。 ### 注意事项 - **禁止混合使用同步异步的 I/O 函数**:一旦使用了 `std::ios::sync_with_stdio(false)` 关闭了同步,就不能再混合使用 C++ 的标准输入输出流(如 `std::cin`、`std::cout`) C 语言的标准输入输出函数(如 `scanf`、`printf`),否则可能会导致输入输出的顺序混乱。 - **在程序开始设置**:`std::ios::sync_with_stdio(false)` `std::cin.tie(nullptr)` 应该在程序开始尽早设置,以确保整个程序的输入输出操作都能受益于这些优化。 - **不同编译器环境的差异**:虽然大多数编译器都支持 `std::ios::sync_with_stdio(false)` `std::cin.tie(nullptr)`,但在不同的编译器环境下,它们的性能提升效果可能会有所不同。 以下是一个示例代码: ```cpp #include <iostream> int main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); int num; std::cin >> num; std::cout << num << std::endl; return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值