把基本输入 scanf getchar gets 的区别

把基本输入 scanf getchar gets 的区别

在写控制台程序的时候,难免会遇到各种各样的输入格式读取,下面比较一下 scanf  getchar 和 gets的区别

首先我们要知道,当用户从键盘键入一个字符串的时候,就会在IO缓冲区内写入信息,这个缓冲区是一个队列,  我们用下面几段代码来检验一下,不同函数对缓冲区的读取效果

这一段代码是测试这三个函数到底读取了哪些字符

代码如下

/*************************************************************************
    > File Name: a.cpp
    > Author: VOID_133
    > ################### 
    > Mail: ################### 
    > Created Time: 2014年10月26日 星期日 00时43分53秒
 ************************************************************************/
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<vector>
#include<cstring>
#include<map>
#include<queue>
#include<stack>
#include<string>
#include<cstdlib>
#include<ctime>
#include<set>
using namespace std;

int main(void)
{
	char s[30];
	//scanf("%s",s);
	//gets(s);
	int len=strlen(s);
	for(int i=0;i<len;i++)
	{
		if(s[i]=='n') s[i]='#';
		if(s[i]=='t') s[i]='$';
                if(s[i]==' ') s[i]='@';
	}
	printf("%s",s);
	return 0;
}

这段代码中,首先用注释掉的scanf来接受输入  输入 test加回车后 输出的只有 test  输入test+tab也是同样的输出,这说明 scanf读取缓冲区时,每一次读取读到TAB 和 ENTER 前 (空格就不用说了 当然不读 ) 当scanf被调用时缓冲区里最前面的元素为有回车和空格符 或TAB scanf直接跳过他们不读

同理测试 gets  发现 gets每一次读取到一个回车前,TAB 和SPACE 它都读。当gets被调用时,缓冲区内第一个元素为ENTER时,gets不读这个ENTER

再测试getchar 简单修改代码即可测试  getchar 会读取所有的字符,但是只有当遇到回车的时候才会输出  这种性质叫务回显,而与它不同的 getch就有回显

 

Leave a Reply

Your email address will not be published. Required fields are marked *

13 − three =

This site uses Akismet to reduce spam. Learn how your comment data is processed.