scanf_s和getchar自己解疑

scanf对流的操作遵从类型匹配操作原则,如果类型不匹配,它将不读取输入流。 因此输入流将滞留,如果输入流不空,scanf不会等待用户输入,直接从缓冲区中输入。添加头文件

#include <stdio.h>

1.scanf_s是scanf的安全版本,这里所谓的安全其实就是在输入的时候进行边界检查罢了。

2 scanf如果用户按照scanf的输入格式输入相应内容入:scanf("%d",&a);这时候,如果用户输入一个整数,scanf返回大于0的整数(1)。相反如果用户输入了一个字符:a那么scanf就会返回0.
3scanf在返回一个值以后在标准输入缓冲区还会剩下上次输入的遗迹,例如上次输入返回值,上次输入的内容(如果和定义的输入格式不相符合,这里要求的是输入整数则输入错误就被设为0)
4这样如果用户输入使得scanf返回值为0,那么下次调用scanf的时候,scanf首先检查输入缓冲区时候为空,(既是不是第一次调用scanf或者被fflush清洗过)如果不是上次的输入遗迹就开始发挥作用,如果上次输入结果符合要求,那么通知终端接收新的输入,如果上次输入不符合要求:既上次输入是违规的输入,不符合定义的输入格式,那么scanf直接返回上次输入的结果以及返回值。

5所以如果在输入出错的情况下,使用fflush来进行清洗是必要的。


getchar 由宏实现:#define getchar() getc(stdin)。

getchar有一个int型的返回值.当程序调用getchar时.程序就等着用户按键.用户输入的字符被存放在键盘缓冲区中.直到用户按回车为止(回车字符也放在缓冲区中).当用户键入回车之后,getchar才开始从stdio流中每次读入一个字符.getchar函数的返回值是用户输入的第一个字符的ASCII码,如出错返回-1,且将用户输入的字符回显到屏幕.如用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续getchar调用读取.也就是说,后续的getchar调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完为后,才等待用户按键.

getch与getchar基本功能相同,差别是getch直接从键盘获取键值,不等待用户按回车,只要用户按一个键,getch就立刻返回,getch返回值是用户输入的ASCⅡ码,出错返回-1.输入的字符不会回显在屏幕上.getch函数常用于程序调试中,在调试时,在关键位置显示有关的结果以待查看,然后用getch函数暂停程序运行,当按任意键后程序继续运行.

这个版本忽略了个重点,getch()是非缓冲输入函数,就是不能用getch()来接受缓冲区已存在的字符

另外补充个函数,getche(),这个函数与前两上类似,功能也相近,都是输入一个字符,返回值同样是输入字符的ASCII码,但不同的是,此函数在输入后立即从控制台取字符,不以回车为结束(带回显)。

这里附上一个自己创建二叉树时候的例子

#include<iostream>
#include <stdio.h>
#include <vector>
using namespace :: std;

struct TreeNode
{
	int val;
	TreeNode * left;
	TreeNode * right;
};
TreeNode * CreateBiTree()
{
	char cData;
	scanf_s("%c",&cData);
	getchar();
	if (cData == '#')
	{
		return NULL;
	}
	else
	{
		TreeNode * Node = (TreeNode *)malloc(sizeof(TreeNode));
		if (Node == NULL)
		{
			return NULL;
		}
		Node->val = cData;
		Node->left = CreateBiTree();
		Node->right = CreateBiTree();
		return Node;
	}
}


你可能感兴趣的:(scanf,getcahr)