C语言学习-2-掌握scanf的循环读取

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
    int i;
    scanf("%d", &i);
    printf("i=%d\n", i);
    return 0;
}

此时运行时只能运行一次

如果我们想要不断地输入要怎么办呢?

scanf()的返回值是成功赋值的变量数量,发生错误时返回EOF。

Q1:什么是EOF?

直接在代码里输入EOF,然后按住ctrl键并鼠标左键点击

自动跳转到stdio.h

在C语言中,EOF(end of file)用来表示文件结束。它是stdio.h里面定义的一个宏,EOF值为-1。

!=为不等于

Q2:什么情况下scanf会出错?

在行首输入ctrl+z

在行首输入ctrl+z

在行首输入ctrl+z

注:mac电脑结束循环输入时用ctrl+d

Q3:什么情况会疯狂打印?

输入10时正常打印,输入a后即会如下图疯狂打印

当我们不提前输入一个10而是直接输入a时会出现如下情况

这是因为在C语言中,编译时系统会先给变量赋予默认值,其中,当定义一个int型变量时,系统会自动给该int型变量赋值于-858993460

所以为什么会疯狂打印呢

比如一开始输入10时,缓冲区内是“10\n”,%d读取了10,留下了\n,而%d可以忽略空格和\n,所以继续输入数字时可以继续读取,而一旦输入了a,此时%d与a并不能匹配,所以此时scanf成功赋值的变量数量为0,又因为0!=-1,所以会无限循环下去。

Q4:如果有时候手抖输入了不是数字的字符呢,应该用什么方法避免出现疯狂打印?

使用rewind清空标准输入缓冲区

注:rewind只有微软可以用,mac不可以

stdin是标准输入

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main()
{
    int i,ret;
    while(rewind(stdin),(ret=scanf("%d", &i))!=EOF)//while是实现循环,没跟分号
    //stdin是标准输入
    {
        printf("i=%d\n", i);
    }
    return 0;
}

利用scanf循环读取,我们可以完成将小写字符串转换为大写字符串的任务

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

int main()
{
    char c;
    while (scanf("%c", &c) != EOF)
    {
        if (c != '\n')
        {
            printf("%c", c - 32);
        }
        else 
        {
            printf("\n");
        }
    }
    return 0;
}

scanf的混合输入时,注意在%c之前加上一个空格即可

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

int main()
{
    int i;
    char c;
    float f;
    scanf("%d %c%f", &i, &c, &f);
    //混合输入时注意每次在%c之前加一个空格
    print("i=%d,c=%c,f=%f\n", i, c, f);
    return 0;
}

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值