在C语言中,当我们有了变量,我们需要给变量输入值就可以使用 scanf ( ) 函数。scanf( ) 函数是用于读取用户键盘输入的函数,其定义于头文件 stdio.h 内,使用此函数时需包含该头文件(即#include<stdio.h>) 。
程序运用到 scanf( ) 语句时,会停下来等待用户从键盘输入。用户输入数据、按下回车键后,scanf( ) 函数就会处理用户的输入,将其存入变量。
scanf( ) 函数的用法与 printf( ) 函数相似,在处理数据时需要提前知道用户输入的数据类型,所以第一个参数是一个格式字符串,里面会放置占位符告诉编译器如何解读用户的输入,需要提取的数据是什么类型。而它的其余参数就是存放用户输入的变量,格式字符串里面有多少个占位符函数中就有多少个变量。
scanf( ) 函数处理用户输入的原理为:
- 依据格式控制字符串确定读取数据的类型与格式
- 从输入缓冲区按序查找匹配数据(输入缓冲区是一个临时存储区域,用于存放用户输入的字符)
- 跳过空白字符,提取并转换数据后存储到对应变量中
- 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