前言
以下内容使用Visual Stdio 2022集成开发环境,配置系统为Windows 11,内容仅针对初学者。
目录
一、scanf函数
Ⅰ、scanf函数的输出格式
scanf函数是一个标准库函数,它的函数原型在头文件“stdio.h”中。当我们需要使用时需要引入stdio.h头文件。scanf函数的一般调用形式如下:
scanf("格式字符",输入列表的地址);
如下
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
float a = 0;
int b = 1;
char arr[10] = { 0 };
scanf("%f 的 %d",&a,&b);
printf("%f %d\n", a, b);
printf("-------------------\n");
scanf("%s", arr);
printf("%s\n", arr);
return 0;
}
结果如下:
第一行与第四行是输入,在scanf函数的输入列表里有什么字符,输入的时候也必须输入对应的字符,否则数据对不上导致结果错误。如下图
Ⅱ、scanf函数不安全性的问题
①在以上代码会发现第一行有一个宏定义#define _CRT_SECURE_NO_WARNINGS,意思是忽略scanf不安全性的问题。
②在Visual Studio中scanf不安全性的原因:scanf不会对放数据的空间进行检测,可能导致输入的数据空间大于原有的数据空间,出现报错,所以scanf不安全。
③可以使用scanf_s函数代替scanf函数,scanf_s是Visual Studio开发工具提供的一个功能与scanf函数相同的安全标准输入函数。
④虽然可以使用scanf_s但scanf_s是VS提供的开发工具,在其他编译器不一定能使用,所以可移植性底,不建议在项目中使用,平常写写代码就行了。
Ⅲ、scanf函数多组输入问题(在线oj试题)
注:必须了解循环
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a = 0;
int i = 0;
while ((scanf("%d", &a)) != EOF)
{
printf("输入%d次,a = %d\n", i, a);
i++;
}
return 0;
}
结果:
①EOF的英文为end of file,意思为文件结束标志(即在文件末尾都隐式存在这个标志),EOF也是一个标识符常量,定义形式为#define EOF -1,这个常量的值为-1。
②当程序还在运行时scanf函数的返回值总为非EOF,所以当程序运行时循环一直进行。
③可以使用ctrl Z + 回车(三次)使得scanf函数返回EOF,ctrl Z是在windows系统下输入EOF标记的方式。
Ⅳ、两个scanf函数连用问题
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a = 0;
char i = 0;
scanf("%d", &a);
scanf("%c", &i);
printf("输出:%d\n", a);
printf("输出:%c\n", i);
return 0;
}
结果:
可以看到我们只输入了一个1程序就结束了,预期结果应该是输入两个数据。
①在需要连续输入数据时,如果第二个输入的数据是单个字符,那么再输入第一个数据之后回车,程序默认回车字符作为你第二个数据,而在ASCII码中回车字符('\n')的值为10,所以由此解释两个scanf连续输入的问题。
②在使用scanf连续输入时尽量避免字符输入在后面,不然会导致回车字符被吸收而影响最终结果。
③解决方案:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a = 0;
char i = 0;
scanf("%d", &a);
getchar();
scanf("%c", &i);
printf("输出:%d\n", a);
printf("输出:%d\n", i);
return 0;
}
结果:
getchar()函数:输入单个字符,并返回。
在进入到第二个字符输入scanf函数之前,先把回车字符用getchar()吸收,便不会影响到数据的输入。