C++输入输出的一些问题

C++输入输出的一些问题

在之前的文章中我们讨论过各种数据类型使用printf输出时,格式化字符串的使用方法。

下面我们来讨论一些其他的输入输出技巧。

scanf读入特定格式的数据

scanf可以读如特定格式的数比方说2:3,可以写成scanf("%d:3%d",&a,&b);

这样的技巧可以很方便的解决(2018蓝桥杯P4)[https://www.lanqiao.cn/problems/175/learning/\]

cpp 复制代码
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;

int T;
const int N=30;
string s;
int main(){
    cin>>T;
    while (T--){
        int t1;
        int b11,b12,b13,b21,b22,b23;
        int e11,e12,e13,e21,e22,e23;
        scanf("%d:%d:%d",&b11,&b12,&b13);
        scanf("%d:%d:%d",&b21,&b22,&b23);
        char input;
        t1=b11*3600+b12*60+b13-(b21*3600+b22*60+b23);
        while (input=getchar(),input!='\n'){
            if (1<=input-'0'&&input-'0'<=9){
                t1+=(input-'0')*24*3600;
            }
        }
        scanf("%d:%d:%d",&b11,&b12,&b13);
        scanf("%d:%d:%d",&b21,&b22,&b23);
        int t2;
        t2=b11*3600+b12*60+b13-(b21*3600+b22*60+b23);
        while (input=getchar(),input!='\n'){
            if (1<=input-'0'&&input-'0'<=9){
                t2+=(input-'0')*24*3600;
            }
        }
        int ans=(t1+t2)/2;
        if (ans<0)
            ans=-ans;
        int h=ans/3600;
        ans-=h*3600;
        int m=ans/60;
        ans-=m*60;
        printf("%02d:%02d:%02d\n",h,m,ans);
    }
    return 0;
}

读入一整行数据

通过笔者进行蓝桥2018P4求解时候的实验,笔者发现直接使用getline()进行数据读取,如果和scanf()进行混合使用就会出现问题。

经过资料查阅,笔者发现了如下的问题:

scanf 读取数据时(比如 %d、%s、%f 等格式),会跳过开头的空白字符(空格、制表符、换行符),但读取完目标数据后,不会清空输入缓冲区中紧随其后的换行符(\n)。

getline(C++ 中的 std::getline 或 C 中的 getline)的逻辑是:从缓冲区读取字符,直到遇到换行符 \n 为止,并且会把这个换行符从缓冲区中移除(但不包含在最终读取的字符串中)。

因此,若getline和scanf混用就会导致缓冲区中换行符的读取出现问题。

这时我们可以避免使用scanf,所有数据读取全部使用getline()

或者我们保留scanf的写法,利用getchar()手动实现读取一行的操作

cpp 复制代码
char input;
while (input=getchar(),input!='\n'){
    ...
}
相关推荐
努力努力再努力wz2 分钟前
【C++高阶系列】告别内查找局限:基于磁盘 I/O 视角的 B 树深度剖析与 C++ 泛型实现!(附B树实现源码)
java·linux·开发语言·数据结构·c++·b树·算法
承渊政道3 分钟前
【优选算法】(实战攻坚BFS之FloodFill、最短路径问题、多源BFS以及解决拓扑排序)
数据结构·c++·笔记·学习·算法·leetcode·宽度优先
王家视频教程图书馆9 分钟前
rust 写gui 程序 最流行的是哪个
开发语言·后端·rust
Wadli12 分钟前
Oncall Agent项目
开发语言
艾莉丝努力练剑17 分钟前
【QT】Qt常用控件与布局管理深度解析:从原理到实践的架构思考
linux·运维·服务器·开发语言·网络·qt·架构
杜子不疼.18 分钟前
用 Python 实现 RAG:从文档加载到语义检索全流程
开发语言·人工智能·python
chao18984419 分钟前
基于改进二进制粒子群算法的含需求响应机组组合问题MATLAB实现
开发语言·算法·matlab
lcj251119 分钟前
字符函数,字符串函数,内存函数
c语言·开发语言·c++·windows
独特的螺狮粉20 分钟前
古诗词飞花令随机出题小助手:鸿蒙Flutter框架 实现的古诗词游戏应用
开发语言·flutter·游戏·华为·架构·开源·harmonyos
cch891823 分钟前
C++、Python与汇编语言终极对比
java·开发语言·jvm