scanf()和getchar()用法和对比分析

本文详细比较了scanf()和getchar()在C语言中的输入函数用法,涉及scanf的转换规则、返回值、getchar的缓冲区原理、用法及返回值特性,帮助理解这两种输入函数在实际开发中的区别和应用场景。
摘要由CSDN通过智能技术生成

前言

主要介绍scanf()和getchar()的用法,以及对比分析这两个函数。

scanf()函数

scanf()函数是C语言<stdio.h>头文件中的内置输入函数,是比较通用的输入函数,因为它可以读取不同格式的数据。从键盘输入的都是文本,因为键盘只能生成文本字符:字母、数字和标点符号。scanf()把输入的字符串转换成整数、浮点数、字符或字符串。

用法

主要记住两条规则:
1、如果用scanf()读取基本变量类型的值,在变量名前加上一个&
2、如果用scanf()把字符串读入字符数组中,不要使用&

	int a;
	char b;
	char c[20];
	scanf("%d %c %s",&a,&b,c);
ANSI C 中的scanf()转换说明

在这里插入图片描述

ANSI C 中的scanf()转换说明中的解释符

在这里插入图片描述
格式字符串中的普通字符串
scanf()函数允许把普通字符放在格式字符串。除空格字符串外的普通字符必须与输入字符串严格匹配。
所谓格式字符串,就是"%d,%c,%s",注意到在上面的代码中,格式字符串里为空格,此处为逗号隔开。也就是格式字符串的形式,就是你的输入形式。此处输入为:1,a,string。如果格式字符串中没有隔开或者以空格隔开,那么在输入时就以空格隔开每次输入。你可能已经注意到用空格隔开,如果输入有空格怎么办?那么scanf()函数是不接受空格输入的。

scanf()的返回值

scanf()返回成功读取的项数,int值。如果没有读取任何项,且需要读取一个数字而用户却输入一个字符串时,scanf()便返回0。当scanf()检测到“文件结尾”时,会返回EOF(EOF是stdio.h定义的特殊值,通常用#define指令把EOF定义为-1,为end of file缩写)。

getchar()函数

getchar()函数同样是C语言<stdio.h>头文件中的内置输入函数,但它每次只处理一个字符。
这里首先要解释一下缓冲区的概念。在一些老式系统中,对于用户的输入的处理是回显用户输入的字符后立即重复打印打印该字符,这种是属于无缓冲(或直接)输入。例如:

hheelllloo wwoorrlldd!!
后来出现了缓冲区的概念,用户输入的字符被收集并存储在一个被称为缓冲区(*buffer*)的临时存储区,按下回车键(enter键)后,程序才可使用用户输入的字符。使用缓冲区的目的是什么了?首先把若干字符作为一个块进行传输比逐个发送这些字符节约时间。其次,如果用户打错字符,可以直接通过键盘修正错误。当最后按下回车键时,传输的是正确的输入。

缓冲分为两类:完全缓冲I/O和行缓冲I/O。完全缓冲输入指的是当缓冲区被填满时才刷新缓冲区(内容被发送至目的地),通常出现在文件输入中。缓冲区的大小取决于系统,常见的大小是512字节和4096字节。行缓冲指的是在出现换行符时刷新缓冲区。键盘输入通常都是行缓冲输入,即在按下回车键后才刷新缓冲区。
C语言中规定都是缓冲输入。

用法

	char ch;
    printf("输入字符值:\n");
    scanf("%c", &ch);
    printf("getchar()函数获取到的值为:%c", getchar());

运行结果:
在这里插入图片描述
可以看到,输入为12,1赋值给了ch变量,getchar()函数智能获取到缓冲区中的未使用的第一个字符2

getchar()返回值

printf("getchar()返回值字节数:%u", sizeof getchar());

运行结果
在这里插入图片描述
其返回值为4字节大小,为int类型;所以在接受getchar()返回值时用int类型的变量进行接受,在打印时:用%c格式进行打印,这里主要涉及到ASCII码的转换。

总结

scanf()函数可以接受许多类型的输入,将接收到的字符串转为整数、浮点数等。输入时的格式要对应格式字符串中的格式进行输入,但是其不能接受空格,’\n’等特殊字符。
getchar()函数一次只能处理一个缓冲区中的字符,可以为任何字符,包括空格,’\n’等特殊字符。值得注意的是其返回值是int类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值