C. scanf 函数基础

scanf 函数

  • 1. scanf 函数基础
    • 1.1 函数原型与头文件
    • 1.2 格式化输入的基本概念
    • 2.1 常见格式说明符
      • 整数格式说明符
      • 浮点数格式说明符
      • 字符和字符串格式说明符
      • 其他格式说明符
    • 2.2 格式说明符的高级用法
      • 宽度修饰符
      • 精度修饰符
      • 跳过输入
      • 字段宽度
      • 组合修饰符
      • 对齐修饰符
      • 实际应用示例
    • 3.2 精度控制
      • 浮点数精度
      • 字符串精度
      • 动态精度
      • 实际应用示例
    • 4.1 返回值的含义
    • 4.2 返回值的应用场景
      • 4.2.1 输入校验
      • 4.2.2 循环读取输入
      • 4.2.3 动态调整输入逻辑
      • 4.2.4 调试与日志记录
    • 5.1 格式化字符串漏洞
      • 格式化字符串漏洞的成因
      • 格式化字符串漏洞的利用
      • 格式化字符串漏洞的实例
    • 5.2 安全使用建议
      • 1. 避免用户可控的格式化字符串
      • 2. 确保格式说明符与参数匹配
      • 3. 使用安全的格式化函数
      • 4. 检查 `scanf` 的返回值
      • 5. 避免使用 `%n` 格式说明符
      • 6. 使用编译器的安全检查功能
    • 6.1 fscanf
      • 使用场景
      • 返回值
    • 6.2 sscanf
      • 使用场景
      • 返回值
    • 7.1 日常编程中的使用场景
      • 1. 输入用户数据
      • 2. 读取配置文件
      • 3. 输入表格数据
      • 4. 输入带条件的数据
      • 5. 输入带时间戳的数据
    • 7.2 复杂格式化输入示例
      • 1. 输入多行格式化数据
      • 2. 动态格式化输入
      • 3. 输入带有颜色的文本
      • 4. 输入带有条件的文本
      • 5. 输入带有时间戳的日志信息

1. scanf 函数基础

1.1 函数原型与头文件

scanf 函数是 C 语言中用于格式化输入的标准函数,其函数原型定义在头文件 <stdio.h> 中。具体原型如下:

int scanf(const char *format, ...);
  • const char *format:格式控制字符串,用于指定输入的格式。它由普通字符和格式说明符组成。普通字符用于匹配输入中的相同字符,而格式说明符则用于指定后续参数的输入格式。
  • ...:表示可变参数列表,这些参数是用于存储输入数据的变量的地址。每个格式说明符对应一个参数,参数的类型必须与格式说明符匹配。

在使用 scanf 函数时,必须包含头文件 <stdio.h>,否则编译器将无法识别该函数。

1.2 格式化输入的基本概念

scanf 函数通过格式控制字符串来实现灵活的输入。格式控制字符串中的格式说明符以 % 开头,后跟一个或多个字符,用于指定输入数据的类型和格式。以下是一些常见的格式说明符及其含义:

格式说明符含义
%d%i输入有符号十进制整数。例如:scanf("%d", &var); 输入 123var 的值为 123
%u输入无符号十进制整数。例如:scanf("%u", &var); 输入 456var 的值为 456
%f输入浮点数。例如:scanf("%f", &var); 输入 3.14var 的值为 3.14
%c输入单个字符。例如:scanf("%c", &var); 输入 Avar 的值为 A
%s输入字符串。例如:scanf("%s", str); 输入 Hellostr 的值为 "Hello"
%p输入指针地址。例如:scanf("%p", &ptr); 输入地址,ptr 的值为该地址。
%%输入一个百分号 %。例如:scanf("%%", &var); 输入 %var 的值为 %

格式说明符还可以包含一些可选的修饰符,用于控制输入的宽度、精度、对齐方式等。以下是一些常见的修饰符及其用法:

  • 宽度修饰符:指定输入的最大宽度。对于字符串,指定最大输入字符数。例如:

    char str[10];
    scanf("%9s", str); // 最多读取 9 个字符
    
  • 精度修饰符:对于浮点数,指定小数点后的位数。例如:

    float var;
    scanf("%f", &var); // 默认读取浮点数
    
  • 对齐修饰符- 用于左对齐,+ 用于强制输出正负号,空格用于在正数前输出空格。例如:

    int var;
    scanf("%d", &var); // 默认读取整数
    

通过合理使用格式说明符和修饰符,scanf 函数可以实现灵活多样的格式化输入,满足各种编程需求。# 2. 格式说明符详解

2.1 常见格式说明符

scanf 函数的格式说明符是实现格式化输入的核心,以下是一些常见的格式说明符及其详细用法:

整数格式说明符

  • %d%i:用于输入有符号十进制整数。这是最常用的整数格式说明符,适用于正负整数。

    int var;
    scanf("%d", &var); // 输入 123,var 的值为 123
    
  • %u:用于输入无符号十进制整数。它适用于非负整数,输入时不会显示负号。

    unsigned int var;
    scanf("%u", &var); // 输入 456,var 的值为 456
    
  • %o:用于输入无符号八进制整数。输入时需要以八进制形式输入,不显示前缀 0

    int var;
    scanf("%o", &var); // 输入 377,var 的值为 255
    
  • %x%X:用于输入无符号十六进制整数。%x 输入小写字母,%X 输入大写字母。

    int var;
    scanf("%x", &var); // 输入 ff,var 的值为 255
    scanf("%X", &var); // 输入 FF,var 的值为 255
    

浮点数格式说明符

  • %f:用于输入十进制浮点数。默认情况下,scanf 会读取小数点和数字,直到遇到非数字字符为止。

    float var;
    scanf("%f", &var); // 输入 3.14159,var 的值为 3.14159
    
  • %e%E:用于输入科学计数法表示的浮点数。%e 输入小写字母 e%E 输入大写字母 E

    float var;
    scanf("%e", &var); // 输入 3.14159e+00,var 的值为 3.14159
    scanf("%E", &var); // 输入 3.14159E+00,var 的值为 3.14159
    

字符和字符串格式说明符

  • %c:用于输入单个字符。输入时只读取一个字符,包括空格和换行符。

    char var;
    scanf("%c", &var); // 输入 A,var 的值为 'A'
    
  • %s:用于输入字符串。输入时会读取连续的字符,直到遇到空格、制表符或换行符为止。

    char str[10];
    scanf("%s", str); // 输入 Hello,str 的值为 "Hello"
    

其他格式说明符

  • %p:用于输入指针地址。输入时需要输入一个有效的指针地址。

    int *ptr;
    scanf("%p", &ptr); // 输入地址,ptr 的值为该地址
    
  • %%:用于输入一个百分号 %。输入时需要输入一个 % 符号。

    char var;
    scanf("%%", &var); // 输入 %,var 的值为 '%'
    

2.2 格式说明符的高级用法

格式说明符还可以结合多种修饰符来实现更复杂的格式化输入,以下是一些高级用法:

宽度修饰符

宽度修饰符用于指定输入的最大宽度。对于字符串,指定最大输入字符数。可以通过以下方式指定宽度:

  • 固定宽度:直接指定一个整数。

    char str[10];
    scanf("%9s", str); // 最多读取 9 个字符
    
  • 动态宽度:使用 * 表示宽度由后续参数指定。

    int width = 9;
    scanf("%*s", &width, str); // 最多读取 9 个字符
    

精度修饰符

精度修饰符用于控制输入的精度,对于浮点数和字符串有不同的含义:

  • 浮点数:指定小数点后的位数。

    float var;
    scanf("%f", &var); // 默认读取浮点数
    
  • 字符串:指定最大输入长度。

    char str[10];
    scanf("%.9s", str); // 最多读取 9 个字符
    

跳过输入

使用 * 修饰符可以跳过某些输入项,不将其存储到变量中。例如:

int a, b;
scanf("%d %*d %d", &a, &b); // 输入 1 2 3,a 的值为 1,b 的值为 3

字段宽度

字段宽度修饰符用于指定输入字段的宽度。对于字符串,指定最大输入字符数。对于数字,指定最大输入数字的位数。例如:

int a;
scanf("%3d", &a); // 输入 1234,a 的值为 123

组合修饰符

可以将多种修饰符组合使用,以实现复杂的格式化需求:

char str[10];
scanf("%-9.5s", str); // 最多读取 9 个字符,字符串的最大长度为 5
```# 3. 输入控制与格式化
## 3.1 宽度与对齐`scanf` 函数通过宽度修饰符和对齐修饰符来控制输入的宽度和

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/83068.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spring cloud loadbalancer实现机房感知的负载均衡

1 概述 在同城多机房情景下&#xff0c;各个机房各自部署一套微服务集群&#xff0c;正常情况下微服务调用在本机房闭环。在如下某些灾难情景&#xff0c;可以尝试拉远调用以最大程度维持业务连续性&#xff0c;这些情景例如&#xff1a; A机房多个服务器宕机。应用由于BUG发…

vue中,created和mounted两个钩子之间调用时差值受什么影响

在 Vue 中&#xff0c;created 和 mounted 是两个生命周期钩子&#xff0c;它们之间的调用时差主要受以下几个因素影响&#xff1a; &#x1f7e2; 1. 模板复杂度与渲染耗时&#xff08;最主要因素&#xff09; mounted 的触发时间是在组件的 DOM 被挂载之后&#xff08;也就是…

Linux篇 第2章Linux基础指令

Linux篇 第2章Linux基础指令 文章目录 前言一、基础的一些命令1.pwd2.mkdir3.ls4.cd5.clear 二、ls1.ls -l2.ls -a3.ls -l -a 三、touch四、 cd1.cd /2.cd ..3.cd ~4. cd - 五、tree1. Linux系统文件的结构2.绝对路径和相对路径 六、mkdir -p七、rmdir&#xff08;没啥用&#…

Scrapyd 详解:分布式爬虫部署与管理利器

Scrapyd 是 Scrapy 官方提供的爬虫部署与管理平台&#xff0c;支持分布式爬虫部署、定时任务调度、远程管理爬虫等功能。本文将深入讲解 Scrapyd 的核心功能、安装配置、爬虫部署流程、API 接口使用&#xff0c;以及如何结合 Scrapy-Redis 实现分布式爬虫管理。通过本文&#x…

国产免费工作流引擎star 6.5k,Warm-Flow升级1.7.2(新增案例和修复缺陷)

文章目录 主要更新内容项目介绍功能思维导图设计器流程图演示地址官网Warm-Flow视频 主要更新内容 [feat] 开启流程实例&#xff0c;新增流程定义是否存在校验[feat] 新增合同签订流程案例[feat] 新增企业采购流程案例[update] mybatis-plus逻辑删除&#xff0c;删除值和未删除…

数据仓库Hive

1.数据仓库 1.1数据仓库的概念 数据仓库&#xff08;Data Warehouse&#xff09;是一个面向主题的、集成的、相对稳定的、反映历史变化的数据集合&#xff0c;用于支持管理决策。 面向主题。操作型数据库的数据组织面向事务处理任务&#xff0c;而数据仓库中的数据按照一定的…

dify 连接不上ollama An error occurred during credentials validation:

三大报错 An error occurred during credentials validation: HTTPConnectionPool(hosthost.docker.internal, port11434): Max retries exceeded with url: /api/chat (Caused by NameResolutionError("<urllib3.connection.HTTPConnection object at 0x7f26fc3c00b0&…

uniapp 生成海报二维码 (微信小程序)

先下载qrcodenpm install qrcode 调用 community_poster.vue <template><view class"poster-page"><uv-navbar title"物业推广码" placeholder autoBack></uv-navbar><view class"community-info"><text clas…

如何理解编程中的递归、迭代与回归?

作为编程初学者&#xff0c;递归、迭代和回归这三个概念常常让人感到困惑。本文将通过生活化的比喻、Python代码示例和直观的对比&#xff0c;帮助你彻底理解这三个重要概念及其应用场景。 一、从生活比喻理解核心概念 1. 递归&#xff08;Recursion&#xff09;—— 俄罗斯套…

Android Studio 模拟器配置方案

Android Studio 模拟器配置方案 1.引言2.使用Android Studio中的模拟器3.使用国产模拟器1.引言 前面介绍【React Native基础环境配置】的时候需要配置模拟器,当时直接使用了USB调试方案,但是有些时候可能不太方便连接手机调试,比如没有iPhone调不了ios。接下来说明另外两种可…

uniapp(vue3)动态计算swiper高度封装自定义hook

// useCalculateSwiperHeight.ts import { ref, onMounted } from vue;export function useCalculateSwiperHeight(headerSelector: string .header-search, tabsWrapperSelector: string .u-tabs .u-tabs__wrapper) {const swiperHeight ref<number>(0);// 封装uni.g…

从代码学习深度学习 - 转置卷积 PyTorch版

文章目录 前言基本操作填充、步幅和多通道填充 (Padding)步幅 (Stride)多通道总结前言 在卷积神经网络(CNN)的大家族中,我们熟悉的卷积层和汇聚(池化)层通常会降低输入特征图的空间维度(高度和宽度)。然而,在许多应用场景中,例如图像的语义分割(需要对每个像素进行分…

c语言第一个小游戏:贪吃蛇小游戏06

实现贪吃蛇四方向的风骚走位 实现代码 #include <curses.h> #include <stdlib.h> struct snake{ int hang; int lie; struct snake *next; }; struct snake *head; struct snake *tail; int key; int dir; //全局变量 #define UP 1 //这个是宏定义&a…

django的权限角色管理(RBAC)

在 Django 中&#xff0c;User、Group 和 Permission 是权限系统的核心组件。下面通过代码示例演示它们的 CRUD&#xff08;创建、读取、更新、删除&#xff09; 操作&#xff1a; 一、User 模型 CRUD from django.contrib.auth.models import User# 创建用户 user User.obje…

解决docker alpine缺少字体的问题 Could not initialize class sun.awt.X11FontManager

制作的springboot项目镜像&#xff0c;缺少字体报错Could not initialize class sun.awt.X11FontManager 原因镜像中缺少字体 解决&#xff1a; 制作镜像时&#xff0c;添加字体库&#xff0c;Dockerfile文件 中添加如下内容 注意&#xff1a; jdk版本一定要使用&#xff0…

MQTT 在Spring Boot 中的使用

在 Spring Boot 中使用 MQTT 通常会借助 Spring Integration 项目提供的 MQTT 支持。这使得 MQTT 的集成可以很好地融入 Spring 的消息驱动和企业集成模式。 以下是如何在 Spring Boot 中集成和使用 MQTT 的详细步骤&#xff1a; 前提条件&#xff1a; MQTT Broker&#xff…

养生:为健康生活注入活力

在快节奏的现代生活中&#xff0c;养生不再是老年人的专属&#xff0c;而是每个人维持身心健康的必修课。从饮食到运动&#xff0c;从睡眠到心态&#xff0c;全方位的养生方式能帮助我们抵御压力&#xff0c;拥抱充满活力的生活。 饮食养生&#xff1a;合理搭配&#xff0c;滋…

Axure设计之内联框架切换页面、子页面间跳转问题

在Axure中&#xff0c;你可以通过以下步骤实现主页面中的内联框架在点击按钮时切换页面内容&#xff0c;从A页面切换到B页面。&#xff08;误区&#xff1a;子页面之间切换不要设置“框架中打开链接”然后选“父级框架”这个交互&#xff09; 主框架页面&#xff08;左侧导航展…

[思维模式-38]:看透事物的关系:什么是事物的关系?事物之间的关系的种类?什么是因果关系?如何通过数学的方式表达因果关系?

一、什么是事物的关系&#xff1f; 事物的关系是指不同事物之间存在的各种联系和相互作用&#xff0c;它反映了事物之间的相互依存、相互影响、相互制约等特性。以下从不同维度为你详细阐述&#xff1a; 1、关系的类型 因果关系 定义&#xff1a;一个事件&#xff08;原因&a…

OJ判题系统第6期之判题逻辑开发——设计思路、实现步骤、代码实现(策略模式)

在看这期之前&#xff0c;建议先看前五期&#xff1a; Java 原生实现代码沙箱&#xff08;OJ判题系统第1期&#xff09;——设计思路、实现步骤、代码实现-CSDN博客 Java 原生实现代码沙箱之Java 程序安全控制&#xff08;OJ判题系统第2期&#xff09;——设计思路、实现步骤…