【c输入流】多种输入与缓冲区分析

背景

写算法时,经常会遇到输入的要求,一般分为三种,以int数字为例,分为输入单个、多个、未知个几种情况,有时需要考虑换行符‘\n’的问题

输入单个

此时使用直接scanf操作即可

int temp;
scanf("%d",&temp);

输入多个

数量不多时,直接scanf操作,数量多可以使用for循环进行输入

int nums[10]={0};
scanf("%d %d %d %d",&nums[0],&nums[1],&nums[2],&nums[3]);
//or
for(int i = 0;i<10;i++)
	scanf("%d",nums[i]);

输入未知个

使用换行符作为结束条件

可以将scanf结合getchar一起使用,使用getchar()获取换行符作为结束的条件。

    int temp[10];
    int i = 0;
    while(1)
    {
        scanf("%d",&temp[i]);
        i++;
        char ch = getchar();//获取缓冲区字符
        if(ch == '\n')
            break;
        else
            cout<<ch<<" ";

    }
    for(int j = 0; j<i; j++)
        cout<<temp[j]<<" ";

上述代码,测试用例:

1 2 3 4 5
        1 2 3 4 5

可以看到,scanf获取数字后,getchar获取了数字后的字符,getchar先后获得了4个空格“ ”,最后获得了换行符“\n”。

模板:

    int nums[100];
    int N = 0;
    do
    {
        scanf("%d",&nums[N++]);
    }
    while(getchar()!='\n');

使用Ctrl+D(Linux)或Ctrl+Z(win)作为结束条件

EOF是文件结束标志,标准输入要输入EOF需要通过通过输入键盘组合键,ctrl+d(Linux)或ctrl+z(Windows)。
步骤:

  1. 输入多组数据,日“1 2 3 4 5”
  2. 回车,触发IO操作,scanf是忽视换行符的
  3. window下按组合键“Ctrl+Z”,输入结束
    int i=0;
    int temp[10];
    while(scanf("%d",&temp[i])!=EOF)
    {
        i++;
    }
    for(int j = 0; j<i; j++)
    {
        cout<<temp[j]<<" ";
    }

在这里插入图片描述
模板:

    int nums[100];
    int N = 0;
    while(~scanf("%d",&nums[N++]));

    for(int j = 0; j<N-1; j++)
    {
        printf("%d ",nums[j]);
    }

关于EOF的更多解释,查看https://blog.csdn.net/henu1710252658/article/details/83040281
关于while(cin>>n)的分析,这里不讨论,
参考:https://www.cnblogs.com/tgycoder/p/4958519.html

getchar

getchar是字符函数,返回值是对应字符的assic值。注意,getchar不接受字符串,输入字符串只能使用获取第一个字符。可以使用gets()获取字符串,与scanf(“%s”)不同的是,gets可以接收空格等,这也是它存在的意义。

    char temp = getchar();
    cout<<temp<<endl;
    //输入:wuhan
	//输出:w

在这里插入图片描述

gets

    char temp[10] ;
    gets(temp);
    cout<<temp<<endl;

在这里插入图片描述
可以接受空格:
在这里插入图片描述

处理换行符

首先知道为什么需要处理换行符?

案例:
如我需要接收一个数字和一个字符串,利用scanf接受数字后,使用gets接受字符串,结果输入数字后程序直接结束了。
在这里插入图片描述
分析:
scanf()函数运行时,Enter触发I/O操作,即换行符是输入结束的标志。此时,所有的输入均保存在缓冲区中,包括最后的换行符“\n”。而scanf不会读取换行符,所以最后换行符滞留在换行符中。同时,gets函数的结束的判断条件是换行符,所以此时gets函数获取换行符后直接结束了输入。
在这种情况下,需要用getchar()来吃掉回车;
如:
在这里插入图片描述

哪些时候需要处理换行符

当你输入一次后,进行第二次输入时但是程序直接结束了,此时需要考虑是否换行符需要处理。因为一些函数忽视换行符,而一些函数不忽视换行符。不忽视时,通常作为输入的结束标志。
(1)使用gets()前处理滞留的换行符
(2)2个使用getchar接收字符,中间需要一个空的getchar()吃回车

C++语言中,换行符案例:https://blog.csdn.net/u012712087/article/details/48008745
cin和scanf时忽视换行符的,cin.getline和gets都是不忽视换行符的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值