指定读取长度
使用scanf可以指定读取输入字符的个数,例如:scanf(“%3d”,&n),当输入 12345 时,因为指定读取 3 位,所以 n=123 scanf(“%5s”,str),输入 nihaoya,str 要只会读取 nihao
匹配特定的字符
因为在使用scanf的时候接收%s 会匹配接受所有字符,且遇到空格默认结束,有些时候我们只需要特定的 一些字符,例如,使用scanf读取hello word,但是实际上只能读取到hello,因为%s遇到空格就结束了,还有我们本来想输入一段英文,但是因为手误输入了一个数字,这个时候一般我们只能强行结束程序重新运行输入,九月刚学习C语言scanf的时候就经常这样,很烦恼。这时我们就可以使用%[XXX]来指定匹配我们需要的字符
例如:scanf(“%[abcd]”,str),表示只接受 abcd4 个字符,例如输入 bcadacdfgad,则 str==“bcadacd“,还可以表示区间,例如 scanf(“%[0-9]”,str),表示只接受 0 到 9, scanf(“%[a-z]”,str),表示只接受小写子母,还可以 scanf(“%[0-9a-f]”,str)表示只接受 16 进制数,scanf(“%[a-zA-Z]”,str),表示只接受子母,还可以 scanf(“%[^\n]”,str),表 示遇到回车符从结束,scanf(“%[^A]”,str),表示遇到字符 A 才结束,scanf(“%[^0- 9]”,str),表示遇到数字才结束。
丢弃读取区字符
scanf() 允许把读取到的数据直接丢弃,不往变量中存放,具体方法就是在 % 后 面加一个*,例如:scanf(“%*d”);,表示读取一个整数并丢弃,scanf(“%*[a-z]”);丢弃一 个小写子母,scanf(“%*[^\n]”),表示丢弃除了回车符以外的所有字符。
#include <stdio.h>
int main(int argc, char const *argv[])
{
int n;
char str[24];
scanf("%*d %d",&n);
scanf("%*[a-z]");
scanf("%[^\n]",str);
printf("n = %d str = \"%s\"\n",n,str);
return 0;
}
输出实例:
对结果的分析:整数 100 被第一个 scanf() 中的%*d 读取后丢弃了,整数 999 被第%d 读取到,并赋值给 n。此时缓冲区中剩下 abcxyzABCXYZ,第二个 scanf() 将 abcxyz 读取并丢弃,剩下的 ABCXYZ 被最后一个 scanf() 读取到并赋值给 str
学习了上面的知识,我们可以用 scanf(“%*[^\n]”);scanf(“%*c”);来清除缓冲区,原理是前面一个 scanf 用来清除除了回车符的所有字符串,后面一个 scanf 用来清除回车符。