目录
一、scanf()函数在C#中的使用
1、scanf()基本用法
2、 scanf 的返回值
二、vs2022中scanf()报错如何修改
一、scanf()函数在C#中的使用
在日常生活中,我们在编写C语言代码过程会出现需要给变量输⼊值的情况,这个时候我们可以使⽤scanf()函数,如果需要将变量的值输出在屏幕上,我们可以使⽤prinf()函数,下⾯看⼀个例⼦:
#include <stdio.h> int main() { int score = 0; printf("请输⼊成绩:"); scanf("%d", &score); printf("成绩是:%d\n", score); return 0; }
运行截图:
我们先简单介绍⼀下scanf() 函数:
1.scanf() 函数⽤于读取用户的键盘输⼊;
2.程序运⾏到这个语句时,会停下来,等待用户从键盘输⼊;
3.用户输⼊数据、按下回⻋键后, scanf() 就会处理用户的输⼊,将其存⼊变量;
4.它的原型定义在头⽂件 stdio.h ;
5.scanf() 的语法跟 printf() 类似。
1、scanf()基本用法
#include<stdio.h> int main() { int i=0; scanf("%d\n",&i); return 0; }
我们观察上方代码,scanf()函数的第一个参数为 格式字符串(比如上方代码的 “%d\n” ),里面会放置占位符【与 printf()的占位符基本一致】,告诉编译器 如何解读用户的输入+其需要提取的数据是什么类型(C语言的数据都是有类型的,scanf()必须提前知道用户输入的数据类型,才能处理数据)。
它的其余参数就是存放用户输入的变量,格式字符串里面有多少个占位符,就需要有多少个变量。上面示例中,scanf()的第一个参数 %d ,表示用户输入的应该是一个整数。 %d 就是一个占位符,%是占位符的标志,d表示整数。第二个参数 &i表示,将用户从键盘输入的整数存入变量。
注:使用
scanf()
时,变量前必须添加“&”
运算符(指针变量除外),也就是在写scanf()函数时变量i前要加上&,因为 scanf()传递的不是值,而是地址,这样可以将用户输入的值存储到变量对应的内存位置。若变量本身是指针类型(比如字符串变量),那就不用添加“&”
运算符。
下⾯是⼀次将键盘输⼊读⼊多个变量的例⼦。
scanf("%d %d %f %f", &i, &j, &x, &y);
上面示例中,格式字符串 %d %d %f %f,表示用户输入的前两个是整数,后两个是浮点数,比如 1 、-20 、3.4 、-4.0e3 。这四个值依次放入i、j、x、y 四个变量。
scanf()处理数值占位符时,会自动过滤空白字符,包括空格、制表符、换行符等,所以用户输入的数据之间,有一个或多个空格不影响 scanf()解读数据。另外,用户使用回车键,将输入分成几行,也不影响解读。
上面示例中,我们分成四行输入,得到的结果与一行输入是完全一样的。每次按下回车键以后,scanf()就会开始解读,如果第一行匹配第一个占位符,那么下次按下回车键时,就会从第二个占位符开始解读。
scanf()处理用户输入的原理是:用户输入的数据先放入缓存,等按下回车键后,程序会根据指定的格式占位符对缓存进行解读。
解读用户输入时,会从上一次解读遗留的第一个字符开始,持续读取缓存内容,直到读完缓存或者遇到第一个不符合条件的字符为止。
#include <stdio.h> int main() { int x=0; float y=0.0f;//将浮点数类型的变量f初始化为0 // ⽤⼾输⼊" -13.45e12# 0" scanf("%d", &x); printf("%d\n", x); scanf("%f", &y); printf("%Le\n", y);//%Le:科学计数法表⽰的long double类型浮点数。 return 0; }
上面示例中,scanf()读取用户输入的 " -13.45e12# 0" 时,%d占位符会忽略起首的空格,从负号“ - ” 开始获取数据,读取到 -13 停下来,因为后面的小数点 “ . ” 不属于整数的有效字符。这就是说,占位符 %d 会读到 -13 。第二次调用 scanf()时,就会从上一次停止解读的地方,继续往下读取。这一次读取的首字符是小数点 “ . ” ,由于对应的占位符是%f,会读取到 .45e12,这是采用科学计数法的浮点数格式,最终会输出为4.5e11。后面的 # 不属于浮点数的有效字符,所以会停在这里。
显示结果:
由于 scanf()可以连续处理多个占位符,所以上面的例子也可以写成下面这样。
#include <stdio.h> int main() { int x=0; float y=0.0f;//将浮点数类型的变量f初始化为0 // ⽤⼾输⼊" -13.45e12# 0" scanf("%d%f", &x, &y) printf("%d %Le\n",x,y);//%Le:科学计数法表⽰的long double类型浮点数 return 0; }
2、 scanf 的返回值
scanf()
函数返回一个整数值,代表成功读取的变量数量;若未读取任何数据或匹配失败,则返回0;如果在读取过程中,发生了读取错误或者读取到文件结尾,则返回常量 EOF(-1)。
注:EOF,即end of file 文件结束标志以下方代码为例:
#include <stdio.h> int main() { int a = 0; int b = 0; float f = 0.0f;//将浮点数类型的变量f初始化为0 int r = scanf("%d %d %f", &a, &b, &f);//记录scanf返回值的个数 printf("a=%d b=%d f=%f\n", a, b, f); printf("r = %d\n", r); return 0; }
1) 输入输出测试:
2) 如果输入2个数后,按ctrl+z,提前结束输入:
3)若未输入任何数字直接按 3 次 Ctrl+Z,程序将输出 -1,即 EOF 状态。
二、vs2022中scanf()报错如何修改
部分用户初学C语言的时候,发现Visual Stdio 2022无法使用scanf()函数,代码怎么检查就是正常的,可就是频频报错!!
下方代码为例,我们在编写一个简单的成绩输入输出代码时,运行时发现程序报错:
我们观察VS2022的报错提示,C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. 该错误提示表示:scanf()这个函数可能不安全,可以考虑使用scanf_s()来代替scanf()函数,如果想要这个错误提示失效,就需要我们在代码第一行写下#_CRT_SECURE_NO_WARNINGS。
这种错误现象是在Visual Stdio软件独有的错误信息,其他编译软件并不会出现。其根本原因是微软出于安全考虑,默认禁用了此类不安全的 C 库函数。具体而言:
scanf
函数无法检查输入数据的长度,当读取字符串或数组时,如果用户输入的数据量超过目标缓冲区容量。例如:
#include<stdio.h> int main() { char s[10]; //s最多存储10个字符 scanf("%s",s);//用户输入 20 个字符 return 0; }
变量s最多存储10个字符却输入 20 个字符,就会引发缓冲区溢出漏洞。为防止此类安全隐患,VS2022 默认启用了严格的安全开发生命周期检查(SDL),将
scanf
标记为已弃用函数,并强制要求使用其安全替代版本scanf_s
(需显式指定缓冲区大小)
笔者在写代码时,发现写
scanf_s()很麻烦,况且其他编译器又不认识它(就Visual Stdio独创),当习惯了写scanf_s()后换到其他编译器写程序会报错,很鸡肋!
就导致需要我们每一次写代码在第一行添加#define _CRT_SECURE_NO_WARNINGS。可每一次都要手动添加呢又很麻烦 ,这时就出现一个好方法!实际上,我们在vs2022上新建.c/.cpp文件的时候,其实是拷贝了一个叫newc++file.cpp的文件。如果能在newc++file.cpp上加上#define _CRT_SECURE_NO_WARNINGS,那么新建的.c/.cpp文件中就会有这句代码。理论成立,那我们实践开始!
(这个时候就需要用到everything这个软件,这个笔者非常推荐,免费!无广告!查找电脑文件真的很快!比电脑自带的文件资源管理器搜索快!!我已经在文章开头附上安装包或到官网,大家可自行下载!)
我们只需要在everything软件的查找页面中输入newc++file后回车----->选中newc++file右击鼠标---->找到“打开路径”并点击
由于部分用户电脑在原路径下对newc++.cpp文件修改保存后系统会报错,提示没有权限,保险起见,笔者建议将 newc++.cpp复制到桌面上后进行处理,也不要将文件拖到桌面上避免出现其他问题。
找到该文件路径的文件后我们Ctrl+C复制到桌面上 。
我们右击找打打开方式---->选择“记事本”打开:
我们文件中输入#define _CRT_SECURE_NO_WARNINGS 1---->进行保存(Ctrl+S)----->我们将桌面上最新保存的newc++file.cpp文件拖回到原文件路径中,将文件进行替换
这时候我们再次打开VS2022新建一个.c/.cpp项时,就会自动出现#define _CRT_SECURE_NO_WARNINGS 1这句话啦!
注意: 我们在添加新项时 切勿点击 左下角的显示紧凑试图下进行添加新项,通过该方式添加的新项第一行 不会自动出现#define _CRT_SECURE_NO_WARNINGS 1这句话!要在显示所有模板的界面中新建项!!!(这个很重要)
(希望对大家有所帮助!若有其他不对之处,请大家批评指正!)