【C语言】C语言期末突击/考研--数据的输入输出
目录
一、printf()输出函数介绍
二、scanf读取标准输入
(一)scanf函数的原理
(二)多种数据类型混合输入
三、练习题
今天我们学习printf和scanf读取标准输入。下面我们开始正式的学习吧。

C语言中有很多内置函数,今天我们主要了解printf()函数和scanf()函数,C语言常用函数我也列在下图了,大家参考学习:
一、printf()输出函数介绍
printf函数可以输出各种类型的数据,包括整型、浮点型、字符型、字符串型等,实际原理是printf函数将这些类型的数据格式化为字符串后,放入标准输出缓冲区,然后将结果显示到屏幕上。
语法如下:
#include <stdio.h>
int printf(const char*format,...)
printf函数根据format给出的格式打印输出到stdout(标准输出)和其他参数中。
字符串格式(format) 由两部分组成:显示到屏幕上的字符和定义printf函数显示的其他参数。我们可以指定一个包含文本在内的format字符串,也可以是映射到printf的其他参数和“特殊”字符,如下列代码所示:
int count= 27;
printf("Hello %s,I've missed you %d times today\n ","HHY",count);
代码的输出如下:
Hello HHY, I've missed you 27 times today
其中,%s表示在该位置插入首个参数 (一个字符串),%d表示第二个参数(一个整数)应该放在哪里。不同的%codes白哦是不同的变量类型,也可以限制变量的长度。printf函数的具体代码格式如下表所示:
| 代码 | 格式 |
| %c | 字符 |
| %d | 带符号整数 |
| %f | 浮点数 |
| %s | 一串字符 |
| %u | 无符号整数 |
| %x | 无符号十六进制数,用小写字母 |
| %X | 无符号十六进制数,用大写字母 |
| %p | 一个指针 |
| %% | 一个'%'符号 |
位于%和格式化命令之间的一个整数被称为最小字段宽度说明符,通常会加上空格来控制格式。
- 用%f精度修饰符指定想要的小数位数。例如,%5.2f 会至少显示5位数字并带有 2位小数的浮点数。
- 用%s精度修饰符简单地表示一个最大的长度,以补充句点前的最小字段长度。
printf 函数的所有输出都是右对齐的,除非在%符号后放置了负号,例如,%-3.4f 会显示3位字符、4位小数位的浮点数并且左对齐。
下面来看一个例子,如下面例子所示。
【例】printf 函数输出对齐:
#include <stdio.h>int main() {int i = 42;float f = 13.14;printf("Student number = %3d grade = %3.4f\n",i,f);printf("Student number = %-3d grade = %3.4f\n",i,f);printf("%12s\n","qualified");return 0;
}
执行结果如下图所示,可以看到整型数 42 在不加负号时靠右对齐,加负号时靠左对齐, %12s 代表字符串共占用12个字符的位置。因为 printf 函数默认靠右对齐,所以"qualified"字符串相对于左边的起始位置有 5个空格的距离。掌握这些内容后,在做编程作业时,就会很容易掌握打印格式的控制。
二、scanf读取标准输入
如下图所示,程序员可以给程序输入数据,程序处理后会返回一个输出,C语言通过函数库读取标准输入,然后通过对应函数处理将结果打印到屏幕上。前面我们学习了printf函数,理解了通过printf函数可以将结果输出到屏幕上,下面详细讲解标准输入函数scanf 。

(一)scanf函数的原理
C语言未提供输入/输出-关键字,其输入和输出是通过标准函数库来实现的。C语言通过scanf函数读取键盘输入,键盘输入又被称为标准输入,当scanf函数读取标准输入时,如果还没有输入任何内容,那么scanf函数会被卡住(专业用语为阻塞) .下面来看一个例子。
【例】:
#include <stdio.h>int main() {int x = 10;char c;scanf("%d",&x);//注意一定要取地址‘&’printf("x = %d\n",x);//fflush(stdin);//清空标准输入缓冲区scanf("%c",&c);printf("c = %c\n",c);return 0;
}
执行时输入23,然后回车,显示运行结果如下图所示。为什么第二个scanf 的数不会被阻塞呢?其实是因为第二个 scanf函数读取了缓冲区中的'\n',即scanf("%c",&c)实现了读取,打印其实输出了换行,所以不会阻塞。

但是如果我们将上面例子中注释的fflush(stdin)打开,就会发现第二个 scanf("%c", &c)会阻塞,这是什么原因呢?下面介绍缓冲区原理:
行缓冲:在这种情况下,当在输人和输出中遇到换行符时,将执行真正的 I/O 处理操作。这时,我们输入的字符先存放到缓冲区中,等按下回车键换行时才进行实际的 I/O 操作,典型代表是标准输人缓冲区 (stdin) 和标准输出缓冲区 (stdout) , printf 使用的是stdout。
如上面的例子所示,我们向标准输人缓冲区中放人的字符为23\n, 输入'\n' (回车) 后, scanf 函数才开始匹配,scanf 丽数中的%d 匹配整型数23,然后放入变量 x 中,接着进行打印输出,这时 '\n' 仍然在标准输人缓冲区(stdin) 内,如果第二个scanf 的数为 scanf("%d'", &x),那么依然会发生阻塞,因为 scanf 函数在读取整型数、浮点数、字符串(后面介绍数组时讲解字符串)时,会忽略\n' (回车符)、空格符等字符 (忽略是指 scanf 的数执行时会首先删除这些字符,然后再阻塞)。scanf 函数匹配一个字符时,会在缓冲区删除对应的字符。因为在执行 scanf("%c", &c)语句时,不会忽略任何字符,所以 scanf("%c", &c)读取了还在缓冲区中残留的'\n'。
(二)多种数据类型混合输入
当我们让 scanf 函数一次读取多种类型的数据时,对于字符型数据要格外小心,因为当一行数据中存在字符型数据读取时,读取的字符并不会忽略空格和'\n'(回车符),所以使用方法如下例所示,编写代码时,我们需要在%d与%c 之间加入一个空格,输人格式和输出效果如下图所示,scanf 函数匹配成功了4个成员,所以返回值为4, 我们可以通过返回值来判断 scanf 函数匹配成功了几个成员,中间任何有一个成员匹配出错,后面的成员都会匹配出错。
【例】一次读入多种类型的数据
#include <stdio.h>int main() {int x,result;char c;float f;result = scanf("%d %c%f",&x,&c,&f);//要在%c之前加一个空格printf("x = %d,c = %c,f = %f\n",x,c,f);return 0;
}
运行结果如下:

三、练习题

下一期:
【C语言】C语言期末突击/考研--整型进制转换
相关文章:
【C语言】C语言期末突击/考研--数据的输入输出
目录 一、printf()输出函数介绍 二、scanf读取标准输入 (一)scanf函数的原理 (二)多种数据类型混合输入 三、练习题 今天我们学习printf和scanf读取标准输入。下面我们开始正式的学习吧。 C语言中有很多内置函数,今…...
How can I fix my Flask server‘s 405 error that includes OpenAi api?
题意:解决包含OpenAI API的Flask服务器中出现的405错误(Method Not Allowed,即方法不允许) 问题背景: Im trying to add an API to my webpage and have never used any Flask server before, I have never used Java…...
LeetCode Hot100 将有序数组转换为二叉搜索树
给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 平衡 二叉搜索树。 示例 1: 输入:nums [-10,-3,0,5,9] 输出:[0,-3,9,-10,null,5] 解释:[0,-10,5,null,-3,null,9] 也将被视为正确…...
【Linux】线程的控制
目录 线程等待 线程退出 线程的优缺点 线程独占和共享的数据 我们说Linux是用进程模拟的线程,所以Linux中只有轻量级进程的概念,但是,用户是只认线程的,所以我们有一个叫原生线程库的东西,它就负责把轻量级进程的系…...
Vue3自研开源Tree组件:人性化的拖拽API设计
针对Element Plus Tree组件拖拽功能API用的麻烦,小卷开发了一个API使用简单的JuanTree组件。拖拽功能用起来非常简单! 文章目录 使用示例allowDragallowDrop支持节点勾选支持dirty检测后台API交互 源码实现 使用示例 组件的使用很简单: 通过…...
MYSQL--触发器详解
触发器 1.触发器简介 触发器(trigger)是一个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update…...
C++实用指南:Lambda 表达式的妙用
Lambda 表达式的灵活性和强大功能确实为编程提供了许多便利。但是我们发现许多开发者仍然无法灵活运用其便利,于是写了这篇文章。 Lambda 允许我们编写更简洁和灵活的代码。例如在处理网络请求时,我们经常需要确保响应与当前的状态或需求仍然相关。通过…...
FastAPI(七十八)实战开发《在线课程学习系统》接口开发-- 评论
源码见:"fastapi_study_road-learning_system_online_courses: fastapi框架实战之--在线课程学习系统" 梳理下思路 1.判断是否登录 2.课程是否存在 3.如果是回复,查看回复是否存在 4.是否有权限 5.发起评论 首先新增pydantic模型 class Cour…...
基于springboot+vue+uniapp的居民健康监测小程序
开发语言:Java框架:springbootuniappJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包&#…...
TypeScript基础【学习笔记】
一、TypeScript 开发环境搭建 下载并安装 Node.js使用 npm 全局安装 typescript 进入命令行输入:npm i -g typescript 创建一个 ts 文件使用 tsc 对 ts 文件进行编译 进入命令行进入 ts 文件所在目录执行命令:tsc xxx.ts 二、基本类型 类型声明 通过类型…...
树莓派物联网服务器搭建流程:集成 Node.js、InfluxDB、Grafana 和 MQTT 协议
目录 一、搭建准备 1. 硬件要求 2. 软件要求 二、技术栈概述 三、搭建步骤 1. 安装操作系统 2. 启动树莓派 3. 更新系统 4. 安装必要的软件 4.1 安装 Python 和 Flask 4.2 安装 Node.js 4.3 安装 Mosquitto(MQTT Broker) 4.4 安装 InfluxDB…...
typescript 断言
/* 断言 确定后期一定是某种格式 可用于表单大对象初始化是空,赋值时有具体字段。前期断言是会是某种格式 */interface obj {name: stringlocation: stringage?: number }// 会报错 // let data: obj { // // } let data: obj {} as obj; // 断言data会有obj里…...
期刊评价指标及其查询方法
1、期刊评价体系一 科睿唯安《期刊引证报告》(Journal Citation Reports, JCR) 科睿唯安每年发布的《期刊引证报告》(Journal Citation Reports, JCR)是一个独特的多学科期刊评价工具。JCR数据库提供基于引文数据的统计信息的期…...
巴斯勒相机(Basler) ACE2 dart 系列说明和软件
巴斯勒相机(Basler) ACE2 dart 系列说明和软件...
【Pycharm中anaconda使用介绍】
在安装好anaconda之后,首先打开anaconda界面,执行以下操作 1.查看Anaconda中当前存在的环境 conda info -e 或者 conda-env list 查看–安装–更新–删除包 conda list: conda search package_name 查询包 conda install package_name conda …...
2024下半年,前端的技术风口来了
“ 你近期有体验过哪些大模型产品呢? 你有使用大模型API做过一些实际开发吗? 在你日常开发中,可以与大模型相关应用结合来完成工作吗? ” **最近,一直在和同事聊,关于前端可以用大模型干点啥ÿ…...
Spock Unit Test in Java
优质博文:IT-BLOG-CN 一、简介 Spock是一个基于Groovy语言的测试和规范框架,使得测试代码更简介,得益于JUnit Runner,Spock兼容大部分IDE和测试框架JUnit/JMock/Powermock等。基于BDD行为驱动开发,功能非常强大。提…...
:= 符号python
在 Python 3.8 及更高版本中,引入了一种新的语法特性,称为"海象运算符"(Walrus Operator),它使用 : 符号。这个运算符的主要目的是在表达式中同时进行赋值和返回赋值的值。 使用海象运算符可以在一些情况下…...
UPLOAD-LABS靶场[超详细通关教程,通关攻略]
---------------------------------------- 靶场环境: 下载链接: https://codeload.github.com/c0ny1/upload-labs/zip/refs/heads/master 使用小皮集成环境来完成这个靶场 将文件放到WWW目录下就可以进行访问 ------------------------------------…...
测试面试宝典(三十七)—— 接口测试中的加密参数如何处理?
1)先了解接口使用的加密方式(md5、rsa...) 2)检查接口测试工具是否支持这种加密方式,如果支持的话,直接使用对应功能就行了(比如Jmeter支持md5);如果加密方式是公司内部特有的算法,可以在接口测试工具中调…...
AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
均衡后的SNRSINR
本文主要摘自参考文献中的前两篇,相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程,其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt 根发送天线, n r n_r nr 根接收天线的 MIMO 系…...
逻辑回归暴力训练预测金融欺诈
简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...
