【C语言基础考研向】05 scanf读取标准输入超详解

文章目录


一.scanf函数的原理

C语言未提供输入/输出关键字,其输入和输出是通过标准函数库来实现的。C语言通过scanf函数读取键盘输入,键盘输入又被称为标准输入。当scanf函数读取标准输入时,如果还没有输入任何内容,那么scanf函数会被卡住(专业用语为阻塞)。下面来看一个例子。

样例

【例】scanf读取标准输入

c 复制代码
#include <stdio.h>
int main() {
    int i =10;
    char  c ;
    scanf("%d",&i);
    printf("%d\n",i);
    scanf("%c",&c);
    printf("%c\n",c);
    return 0;
}

输入:20

输出结果如下:

20

执行时输入20,然后回车,显示结果如下图所示.为什么第二个scanf函数不会被阻塞呢?其实是因为第二个scanf函数读取了缓冲区中的'\n',即 scanf("%c",&c)实现了读取,打印其实输出了换行,所以不会阻塞.

问题原因

在解决这个问题之前先引入标准输入缓冲区

我们输入了一个20和一个回车,程序会依次的从标准输入缓冲区中取出它们,但是值得注意的是,scanf 函数在读取整型数、浮点数、字符串时,会忽略'\n'(回车符)、空格符等字符(忽略是指scanf函数执行时会首先删除这些字符,然后再阻塞) , scanf 函数匹配一个字符时,会在缓冲区删除对应的字符,因为在执行scanf("%c",&c)语句时,不会忽略任何字符,所以scanf("%c",&c)读取了还在缓冲区中残留的'\n'.

解决方法

在读入字符之前,加入清空缓冲区的语句

c 复制代码
fflush(stdin); //清空缓冲区
c 复制代码
#include <stdio.h>
int main() {
    int i = 10;
    char c;
    scanf("%d", &i);
    printf("%d", i);
    fflush(stdin);
    scanf("%c", &c);
    printf("%c\n", c);
    return 0;
}

输入:20 a

输出结果如图:

20

a


二.多种数据类型混合输入

当我们让 scanf函数一次读取多种类型的数据时,对于字符型数据要格外小心,因为当一行数据中存在字符型数据读取时,读取的字符并不会忽略空格和'\n'(回车符),所以使用方法如下例所示.编写代码时,我们需要在%d与%c之间加入一个空格.输入格式和输出效果如下图所示, scanf函数匹配成功了4个成员,所以返回值为4,我们可以通过返回值来判断scanf函数匹配成功了几个成员,中间任何有一个成员匹配出错,后面的成员都会匹配出错.

错误样例

c 复制代码
#include <stdio.h>
int main()
{
int i,ret;
char c;
float f;
ret=scanf(""%d%c%f"",&i,&c,&f);//要在%c之前加个空格
printf( "i=%d,c=%c,f=%5.2f\n",i,c,f);
return 0;
}

输入: 1 a 3.2

输出结果如下:

i=1,c=,f= 0.00

正确样例

c 复制代码
#include <stdio.h>
int main()
{
    int i,ret;
    char c;
    float f;
    ret=scanf("%d %c %f",&i,&c,&f);//要在%c之前加个空格
    printf( "i=%d,c=%c,f=%5.2f\n",i,c,f);
    return 0;
}

输入: 1 a 3.2

输出结果如下:

i=1,c=a,f= 3.20

相关推荐
ZK_H11 分钟前
观星者手记_开发日志1
c语言
zhangrelay35 分钟前
三分钟云课实践速通--C/C++程序设计--
linux·c语言·c++·笔记·学习·ubuntu
szial42 分钟前
Python Click 教程:从函数到专业命令行工具
开发语言·python
Karle_42 分钟前
为AI编辑器准备c++编译环境,onnxruntime、cmake、cl,网上坑太多备份记录后续方便使用。
开发语言·c++·编辑器
Dxy123931021642 分钟前
JavaScript 字符串转数值(小数)
开发语言·javascript·ecmascript
努力努力再努力wz1 小时前
【MySQL 进阶系列】C/C++ 如何通过客户端库访问 MySQL?从连接原理到 API 调用流程详解(附完整demo代码)
服务器·c语言·数据结构·数据库·c++·b树·mysql
yu85939581 小时前
matlab实现ARMA(自回归移动平均)模型
开发语言·matlab·回归
lbb 小魔仙1 小时前
Ollama 本地部署大模型 + Python API 集成开发完整教程(2026最新版,含 GPU 加速配置)
开发语言·python
民乐团扒谱机1 小时前
【微实验】平滑轨迹的数学基石:二次贝塞尔曲线原理、插值逻辑、形态控制与MATLAB全解析
开发语言·matlab
CSCN新手听安1 小时前
【Qt】Qt窗口(七)QColorDialog颜色对话框,QFileDialog文件对话框的使用
开发语言·c++·qt