首页 > 其他分享 >scanf( ) 函数的介绍

scanf( ) 函数的介绍

时间:2025-01-20 22:03:12浏览次数:3  
标签:字符 函数 scanf 用户 介绍 占位 输入

    在C语言中,当我们有了变量,我们需要给变量输入值就可以使用 scanf ( ) 函数。scanf( ) 函数是用于读取用户键盘输入的函数,其定义于头文件 stdio.h 内,使用此函数时需包含该头文件(即#include<stdio.h>) 。

    程序运用到 scanf( ) 语句时,会停下来等待用户从键盘输入。用户输入数据、按下回车键后,scanf( ) 函数就会处理用户的输入,将其存入变量。

    scanf( ) 函数的用法与 printf( ) 函数相似,在处理数据时需要提前知道用户输入的数据类型,所以第一个参数是一个格式字符串,里面会放置占位符告诉编译器如何解读用户的输入,需要提取的数据是什么类型。而它的其余参数就是存放用户输入的变量,格式字符串里面有多少个占位符函数中就有多少个变量。

scanf( ) 函数处理用户输入的原理为:

  1. 依据格式控制字符串确定读取数据的类型与格式
  2. 从输入缓冲区按序查找匹配数据(输入缓冲区是一个临时存储区域,用于存放用户输入的字符)
  3. 跳过空白字符,提取并转换数据后存储到对应变量中
  4. scanf( ) 函数执行完毕后,会返回一个整数值,表示成功读取的变量个数。(如果没有读取任何项或者匹配失败,则返回 0;如果在读取过程中遇到错误或到达文件末尾,则返回常量 EOF)

    如上述程序,scanf( ) 函数第一个参数是 %d ,表示用户输入的应该是一个整数。 第二个参数 &num 表示,将用户从键盘输入的整数存入变量 num 中。& 是取地址运算符,用于获取变量在内存中的地址。例如,&a 表示获取变量 a 的内存地址。这个地址是一个十六进制的数值,表示变量在内存中存储的位置。

    要注意:变量的前面必须加上 & 运算符,因为 scanf( ) 函数传递的不是变量的值而是地址。

    scanf( ) 函数处理数值占位符时,会自动过滤掉空白字符,包括空格、制表符、换行符等。所以用户输入的数据之间有一个或多个空格也不影响 scanf( ) 函数解读数据。另外,用户使用回车键将键入分为几行也不影响解读。

 一次在键盘上输入多个变量:

    上图中的代码运行起来后,在同一行输入与分为三行输入得到的结果是完全一样的。分成三行时,用户的输入会先放入输入缓冲区,之后每按下一次回车键后 scanf( ) 就会按照占位符对缓存进行一次解读。如果第一行匹配第一个占位符,那么下次按下回车键时就会自动从第二个占位符开始解读(解读用户输入时,会自动从上一次解读遗留的第一个字符开始,直到读完缓冲区的所有字符或者遇到第一个不符合条件的字符)。

示例:

    可以看到,上面示例中 scanf( ) 在读取输入时会自动忽略开头的空格从 1 开始读取数据,到 3 停下,因为后面的小数点不属于占位符 %d 类型的有效字符。而第二次调用该函数时会自动从上一次停止读取的地方继续进行读取。这次读取对应的占位符为 %f ,会从小数点一直读到最后的 5。 

    scanf( ) 常用的占位符与 print( ) 的相似,这里不再过多介绍。其中除了用于读取字符的 %c 占位符以外,其他都会自动忽略起首的空白字符(即空格、换行符等)。如果占位符 %c 要强制跳过字符前的空白字符 ,可以写成 scanf( " %c",&ch),即 %c 前加上一个空格就可以表示跳过空白字符。 另外,占位符 %s 也比较特殊,它在此时不能简单地等同于字符串。因为它自第一个非空白字符开始解读,遇到空白字符就自动停止(将空格白字符作为字符串结束的标志),所以它不适合用来读取包含空格的字符串(比如英文句子等),除非多个 %s 一起使用。

    有时,用户的输入可能不符合预定的格式,比如:

    上面示例中,如果像左图一样输入 “2025-1-1” 就会正确解读出年、月、日,但用户也可能输入为其他格式,比如右图中的 “2025 1 1”,scanf( ) 就会解读失败。为了避免这种情况,我们可以使用一个 %c 占位符,并在 % 后面加上一个 * (如下图),这样该占位符就不会返回值,解析后直接丢弃,这里的 * 被称作赋值忽略符。

    最后,在 VS2022 编译器中,直接使用 scanf( ) 函数会报错,该编译器会认为它是不安全的,需要在代码顶部加上 #define _CRT_SECURE_NO_WARNINGS 以正常使用。

 

标签:字符,函数,scanf,用户,介绍,占位,输入
From: https://blog.csdn.net/2402_89112112/article/details/144543921

相关文章

  • 【第一天】零基础入门刷题Python-算法篇-数据结构与算法的介绍(持续更新)
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、Python数据结构与算法的详细介绍1.基本概念2.Python中的数据结构1.列表(List)2.元组(Tuple)3.字典(Dictionary)4.集合(Set)5.字符串(String)3.Python中的常用算法1.排序算法2.搜索算法3.递......
  • python的函数学习
    函数定义方式Python:defmy_function(param1,param2,keyword_param=None):returnparam1+param2+(keyword_paramifkeyword_paramisnotNoneelse0)Python使用def关键字来定义函数。参数类型不需要显式声明,Python是动态类型语言。C/C++:intmy_function(intp......
  • rust学习-函数的定义与使用
    rust学习-函数的定义与使用1.函数的基本定义2.函数的参数多个参数3.返回值提前返回4.函数调用5.函数的所有权和借用传递所有权借用6.函数作为参数和返回值函数作为参数函数作为返回值7.泛型函数8.函数注释(文档注释)1.函数的基本定义在Rust中,函数使用fn......
  • MATLAB专题4 函数
    目录一、函数声明二、函数调用三、匿名函数四、递归函数函数:一个能够实现特定功能的逻辑模块一、函数声明注意基本结构与一些注意事项:函数声明的下一行可以添加注释,可在命令行用help或者lookfor调用二、函数调用注意三种变量:1.局部变量:函数中的变量函数结束后......
  • STM32之FreeRTOS开发介绍(十九)
    STM32F407系列文章- freertos(十九)目录前言一、简述二、开源网址三、原理及功能特性1.原理2.功能3.特点4.优缺点四、参考书籍五、实现方式总结前言FreeRTOS是一个免费的、开源的实时操作系统,专为微控制器和嵌入式系统设计,它以其轻量级、高效、易于移植和强大......
  • FastReport调用Delphi中的自定义函数(人民币大写金额)
    人民币大写金额转换函数1functionMoneyToCn(ANumberic:Real):string;2const3s1:string='零壹贰叁肆伍陆柒捌玖';4s2:string='分角元拾佰仟万拾佰仟亿拾佰仟万';56functionStrTran(constS,s1,s2:string):string;7begin8Result:=St......
  • 函数篡改注入
    一、介绍利用函数篡改注入可以避免使用 VirtualAlloc/Ex WinAPI调用,使用新代码替换原始函数的字节,导致函数被替换或不再按预期工作。相反,函数将执行不同的逻辑。要实现这一点,需要一个被践踏的牺牲函数地址(1)选择目标函数本地获取函数地址很简单,但用这种技术获得的主要关注点......
  • 迅为RK3568开发板SPI驱动指南-mcp2515驱动编写:读寄存器函数
    瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和MaliG522EE图形处理器。RK3568支持4K解码和1080P编码,支持SATA/PCIE/USB3.0外围接口。RK3568内置独立NPU,可用于轻量级人工智能应用。RK3568支持安卓11和linux系统,主要面向......
  • STM32 中 GPIO 的八种工作模式介绍
    STM32的GPIO有八种工作模式,分为输入模式和输出模式,以下是详细介绍:输入模式1. 浮空输入(GPIO_Mode_IN_FLOATING)• 工作原理:引脚不连接内部上拉或下拉电阻,完全依赖外部电路来确定电平。引脚电平状态不确定,容易受外界干扰。• 适用场景:适用于连接高阻抗输出的外部设备,如......
  • GBase UCASE 和 UPPER 函数详解
    UCASE 和 UPPER 是两个用于将字符串中的字符转换为大写形式的SQL函数。它们在数据处理、报告生成、文本分析以及各种需要统一字符串格式的场景中非常实用。通过这些函数,用户可以确保数据的一致性,方便后续的比较和分析操作。1. UCASE 和 UPPER 函数的基本语法这两个函数在......