常用的数据输入/输出函数总结(scanf函数部分)

前言

        众所周知,程序员可以给程序输入数据,而程序处理后会返回一个输出。C语言使用函数库读取标准输入,然后再使用对应函数处理将结果打印到屏幕上。

        printf函数可以将结果输出到控制台窗口中,而负责标准输入的则是scanf和getchar函数。本文简要总结下学习的scanf部分知识。


一、scanf函数原理

        C语言并未提供输入输出关键字,它的输入和输出是利用标准函数库来实现的。因此C语言通过scanf函数读取键盘输入(即标准输入)。当scanf读取标准输入时,如果还没输入任何内容,那么scanf函数会被卡住(即阻塞),这时候就涉及缓冲区的知识了。

         缓冲区其实是一段内存空间,分为读缓冲和写缓冲。C语言缓冲有三种特性:全缓冲、行缓冲、不带缓冲

       (1)全缓冲:当填满标准I/O缓存后才会进行实际I/O操作,典型代表就是对此盘文件的读写操作。

       (2)行缓冲:当在输入和输出中遇到换行符时,才会执行真正的I/O操作。这时,我们输入的字符是会先存放到缓冲区中,等按下回车键换行时才进行实际的I/O操作。典型代表就是标准输入缓冲区( stdin)和标准输出缓冲区( stdout )。

       (3)不带缓冲:即不进行缓冲,标准出错情况(stderr) 是典型代表,这使得出错信息可以直接尽快地显示出来。

          ANSIC (即C89) 要求缓存具有下列特征:
         (1)当且仅当标准输入和标准输出不涉及交互设备时,它们才是全缓存的。
         (2)标准出错绝不会是全缓存的

#define _CRT_SECURE_NO_WARNINGS
#include 

//读取标准输入的函数会阻塞,口语卡住
//缓存区里面是空的时候,scanf才会阻塞
int main()
{
	int i;
	scanf("%d", &i);//读取标准输入
	printf("i=%d\n", i);
	int j;
	scanf("%d", &j);//%d %f 会忽略缓冲区的\n和空格
	printf("j=%d\n", j);
	//scanf %c不会忽略任何字符
	return 0;
}  
//%c能读取一切

 

二、scanf函数循环读取

        如果想输入多个整数(每次输入都回车的情况下),要让scanf函数实现读取并打印输出,就需要一个while循环,代码中为什么要加入rewind(stdin)函数呢?因为rewind函数具有清空标准输入缓冲区的作用。

         如果此时输错了,输入的为字符型数据,那么scanf函数就无法匹配成功,scanf
函数未匹配成功时其返回值为0——即ret的值为0,但这并不等于EOF(因为EOF的返回值为
-1)。虽然scanf函数无法匹配成功,但程序仍会进入循环,这就会导致不断地重复打印。想要退出的话只能Ctrl+Z,让scanf函数匹配失败,循环结束。

#define _CRT_SECURE_NO_WARNINGS
#include 
//rewind(stdin) 清空标准输入缓冲区
int main()
{
	int i,ret;
	while (rewind(stdin),(ret=scanf("%d", &i)) != EOF)
	{
		printf("i=%d\n", i);
	}
	return 0;
}

总结

        以上就是对近期scanf函数重新学习的一些小结,本文仅仅简单介绍了scanf函数进行标准输入的简单应用,第一次发表博客有什么不足之处烦请谅解,谢谢浏览!

你可能感兴趣的:(C语言学习感慨,c语言)