摘要:scanf在C语言中的作用,scanf函数用法如果你想让自己的输入更加炫酷、更加个性化、更加安全,那么还需要学习scanf()的高级用法,这才是大神和菜鸟的分水岭。好了,言归正传,我们分三个方面讲解scanf()的高级用法。1)指定读取长度...
#include <stdio.h>
int main(){
int n;
char str[30];
scanf("%*d %d", &n);
scanf("%*[a-z]");
scanf("%[^\n]", str);
printf("n=%d, str=%s\n", n, str);
return 0;
}
输入示例:
100 999abcxyzABCXYZ↙
n=999, str=ABCXYZ
对结果的分析:整数 100 被第一个 scanf() 中的%*d读取后丢弃了,整数 999 被第%d读取到,并赋值给 n。此时缓冲区中剩下 abcxyzABCXYZ,第二个 scanf() 将 abcxyz 读取并丢弃,剩下的 ABCXYZ 被最后一个 scanf() 读取到并赋值给 str。
大家有没有意识到,将读取到的字符直接丢弃,这就是在清空输入缓冲区呀,虽然有点蹩脚,但是行之有效。在C语言基础——清空缓存区 中我们已经给出了使用 scanf() 清空缓冲区的方案,就是:
scanf("%*[^\n]"); scanf("%*c");
下面我们就来解释一下。
首先需要明白的是,等到需要清空缓冲区的时候,缓冲区中的最后一个字符一定是换行符\n,因为输入缓冲区是行缓冲模式,用户按下回车键会产生换行符,结束本次输入,然后输入函数开始读取。
scanf("%*[^\n]");将换行符前面的所有字符清空,scanf("%*c");将最后剩下的换行符清空。
有些网友将这两条语句合并起来,写作:
scanf("%*[^\n]%*c");
这是错误的。合并以后的语句不能清空单个换行符,因为该语句要求换行符前边至少要有一个其它的字符,单个换行符会导致匹配失败。
总结
scanf() 控制字符串的完整写法为:
%{*} {width} type
其中,{ } 表示可有可无。各个部分的具体含义是:
type表示读取什么类型的数据,例如 %d、%s、%[a-z]、%[^\n] 等;type 必须有。
width表示最大读取宽度,可有可无。
*表示丢弃读取到的数据,可有可无。
scanf 的使用看似细节繁杂,但使用起来非常简单。就目前而言,只要掌握以下五点:
在 scanf 的“输入参数”中,变量前面的取地址符&不要忘记。
scanf 中双引号内,除了“输入控制符”外什么都不要写。
“输出控制符”和“输出参数”无论在“顺序上”还是在“个数上”一定要一一对应。
“输入控制符”的类型和变量所定义的类型一定要一致。对于从键盘输入的数据的类型,数据是用户输入的,程序员是无法决定的,所以在写程序时要考虑容错处理,这个稍后再讲。
使用 scanf 之前先用 printf 提示输入。
————————————————
scanf() 格式控制符汇总
格式控制符
说明
%c
读取一个单一的字符
%hd、%d、%ld
读取一个十进制整数,并分别赋值给 short、int、long 类型
%ho、%o、%lo
读取一个八进制整数(可带前缀也可不带),并分别赋值给 short、int、long 类型
%hx、%x、%lx
读取一个十六进制整数(可带前缀也可不带),并分别赋值给 short、int、long 类型
%hu、%u、%lu
读取一个无符号整数,并分别赋值给 unsigned short、unsigned int、unsigned long 类型
%f、%lf
读取一个十进制形式的小数,并分别赋值给 float、double 类型
%e、%le
读取一个指数形式的小数,并分别赋值给 float、double 类型
%g、%lg
既可以读取一个十进制形式的小数,也可以读取一个指数形式的小数,并分别赋值给 float、double 类型
%s
读取一个字符串(以空白符为结束)
————————————————
本文地址:百科问答频道 https://www.neebe.cn/wenda/938790_3.html,易企推百科一个免费的知识分享平台,本站部分文章来网络分享,本着互联网分享的精神,如有涉及到您的权益,请联系我们删除,谢谢!