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

news/2024/7/24 12:35:41 标签: c语言, 考研, 开发语言

文章目录

  • 一.scanf函数的原理
    • 样例
    • 问题原因
    • 解决方法
  • 二.多种数据类型混合输入
    • 错误样例
    • 正确样例

一.scanf函数的原理

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

样例

【例】scanf读取标准输入

#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’.

解决方法

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

fflush(stdin); //清空缓冲区
#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函数匹配成功了几个成员,中间任何有一个成员匹配出错,后面的成员都会匹配出错.

错误样例

#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

正确样例

#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


http://www.niftyadmin.cn/n/5332408.html

相关文章

经典目标检测YOLO系列(二)YOLOV2的复现(1)总体网络架构及前向推理过程

经典目标检测YOLO系列(二)YOLOV2的复现(1)总体网络架构及前向推理过程 和之前实现的YOLOv1一样&#xff0c;根据《YOLO目标检测》(ISBN:9787115627094)一书&#xff0c;在不脱离YOLOv2的大部分核心理念的前提下&#xff0c;重构一款较新的YOLOv2检测器&#xff0c;来对YOLOV2有…

NOIP2004提高组T4:虫食算

题目链接 [NOIP2004 提高组] 虫食算 题目描述 所谓虫食算&#xff0c;就是原先的算式中有一部分被虫子啃掉了&#xff0c;需要我们根据剩下的数字来判定被啃掉的数字。来看一个简单的例子&#xff1a; 43#9865#045 8468#6633 ‾ 44445509678 \begin{aligned} \verb!43#9865…

Tensorflow2.0笔记 - 基础数学运算

本笔记主要记录基于元素操作的,-,*,/,//,%,**,log,exp等运算&#xff0c;矩阵乘法运算&#xff0c;多维tensor乘法相关运算 import tensorflow as tf import numpy as nptf.__version__#element-wise运算&#xff0c;对应元素的,-,*,/,**,//,% tensor1 tf.fill([3,3], 4) ten…

LINUX基础培训十之服务管理

前言、本章学习目标 了解LINUX中的服务种类了解LINUX中常见服务的端口熟悉服务的日常管理掌握添加自定义服务 一、Linux系统服务含义及其分类 系统服务是在后台运行的应用程序&#xff0c;并且可以提供一些本地系统或网络的功能。我们把这些应用程序称作服务&#xff0c;也…

Springboot 子工程构建完后无法找到springboot依赖

问题: 构建完子工程后无法找到SpringBootTest 解决方案: 最好用这个构建 https://www.cnblogs.com/he-wen/p/16735239.html 1.先观察项目目录 是否正确 2.观察子工程目录 3.看pom.xml中是否引用springboot依赖 4.检查代码 查看父项目是否包含子模块 查看子模块的父项目是否…

【DevOps-08-5】目标服务器准备脚本,并基于Harbor的最终部署

一、简要描述 告知目标服务器拉取哪个镜像判断当前服务器是否正在运行容器,停止并删除如果目标服务器已经存在当前镜像,删除当前版本的镜像目标服务器拉取Harbor上的镜像将拉取下来的镜像运行成容器二、准备目标服务器脚本文件 1、在部署的目标服务器准备deploy.sh部署脚本 …

ArcGIS Pro 标注牵引线问题

ArcGIS Pro 标注 模仿CAD坐标牵引线问题 右键需要标注的要素&#xff0c;进入标注属性。 选择背景样式 在这里有可以选择的牵引线样式 选择这一个&#xff0c;可以根据调整间距来进行模仿CAD标注样式。 此图为cad样式 此为调整后gis样式 此处可以调整牵引线的样式符号 …

5-微信小程序语法参考

1. 数据绑定 官网传送门 WXML 中的动态数据均来自对应 Page 的 data。 数据绑定使用 Mustache 语法&#xff08;双大括号&#xff09;将变量包起来 ts Page({data: {info: hello wechart!,msgList: [{ msg: hello }, { msg: wechart }]}, })WXML <view class"vie…