scanf函数的介绍
前言
scanf函数是C语言标准的输入语句,它与printf函数语法类似。本文详细讨论一下scanf函数的各种用法和一些注意点。
一、基本用法
- scanf函数用于读取用户的键盘输入并赋值给变量,当程序运行到这里是会停下并等待用户输入再继续执行程序。原理是将用户输入的放入缓存,编译器再按照占位符对数据进行解读。
- scanf里面包含这些参数:首先是告诉编译器数据类型的占位符;然后是相对应的变量,这些变量前需要加上取地址符&,以表示将值赋给这个变量。
因为scanf函数传递的是地址,所以指针变量不需要加&(如字符串变量) - scanf函数的读取是严格按照对应的占位符读取的,它会从头读取输入的数据直至第一个不符合的数据类型并停下,然后将该类型赋给第一个变量。
- 用户输入数据后按下回车键,编译器开始读取,如果类型符合将会赋值,用户接着按下回车键将开始下一个数据的读取
scanf函数的返回值和占位符
- 返回值
- 对于scanf这个函数,C语言里规定它的返回值是int类型的,即整数。scanf函数在运行完之后会返回一个整数值,这个值其实是scanf函数成功读取到的数据个数。
如果定义一个变量
int a = scanf(“%d”,&c,&b)
printf(“%d”,a)
这时候如果打印c的值,如果成功读取c,a的值就是1,成功读取b和c,a的值就是2
- 如果成功读取任何数据之前就发生读取错误或者读到了文本末尾,通常返回常量EOF(-1)
EOF即end of file 是文件结束标志
-
占位符
scanf的语法和printf相似,占位符也基本一致,如下
• %c :字符。
• %d :整数。
• %f : float 类型浮点数。
• %lf : double 类型浮点数。
• %Lf : long double 类型浮点数。
• %s :字符串。
• %[ ]:在⽅括号中指定⼀组匹配的字符(⽐如 %[0-9] ),遇到不在集合之中的字符,匹配将会停⽌。
上面所有占位符之中,除了 %c 以外,都会自动忽略起首的空白字符。 %c 不忽略空白字符,总是返回当前第⼀个字符,无论该字符是否为空格
scanf函数在处理占位符时,会自动过滤掉空白字符并将数据对应,但%c存在的话,就会读取空格。如果要强制跳过字符前的空⽩字符,可以写成scanf(" %c", &ch)
即 %c 前加上⼀个空格,表⽰跳过零个或多个空⽩字符。
特别说一下占位符 %s ,它其实不能简单地等同于字符串。它的规则是,从当前第⼀个非空白字符开始读起,直到遇到空白字符(即空格、换行符、制表符等)为止。如果要一直读取可以写成"%[^\n ]s",它代表一直读取知道遇到\n,即换行操作。
函数的一些注意点
- scanf函数将字符串读入字符数组时,不会检测是否超过了数组的长度,所以储存时很有可能会超过数组的长度,这就带来了不可预测的程序安全问题,此时最好在使用%s是写成%[m]s,其中的[m]就是一个整数,表示读入的最大长度,此后的数据将被丢弃。
- scanf函数在遇到%s是会在字符串末尾自动加入一个\0,同时算一个字符占一个位置。所以有时候一个数组并不能正确存入那么多数据
- scanf如果要实现多次输入或输入多个变量的话,可以放在循环中,如
while(scanf(“%d”,&a,&b) !==2 )
如果想要程序终止,可以直接输入CTRL+Z回车,但是VS环境下需要输入三次
上述循环也应用了scanf函数的返回值,表示需要读取到正确的数据个数,才会进行循环,防止输入错误的数据类型。
- 用户在使用时可能不符合预定的格式。
像这样如果输入2024 11 25,也许会导致解读失败,所以scanf里有一个赋值忽略符“ * ”,只要吧这个独好加在任何占位符的百分号后面,该占位符就不会返回任何值
** 补充 **
因为scanf函数是不安全的,所以在VS环境下会报警导致不能使用,有一个解决办法是在文件的第一行补上:
#define _CRT_SECURE_NO_WARNINGS
如果要一劳永逸,就在电脑里找到newC++files.cpp这个文件,复制到桌面,用记事本打开,再加上这一行保存,再放回到原路径即可
这是第一次发自己的学习笔记,本人也是小白,有什么不完善的各位大佬体谅