scanf的基本用法除了常规的输入操作外还有一些特殊的用法,使用这些用法可以很方便的在输入中读取想要的数据
1、限制输入数据的长度
这个应该算不上拓展用法,大多数读者应该都曾经使用过,这里简单提一下
输入int类型
int main()
{
int a = 10;
scanf("%3d", &a);
printf("%d", a);
return 0;
}
scanf("%3d", &a)限制输入数据的长度最多为3,如果数据长度大于3则只读取前3位数据,如果输入数据长度小于3,因为有回车符的存在也会结束输入
运行结果:
输入char类型
注意输入char字符类型时不能限定长度(注意是字符,不是字符串),笔者目前能查到的信息给出的原因:语法规定,其实想一下也说得通,读取一个字符,总不能scanf("%2c")把两个字符塞到一个字符的空间里吧
输入字符串类型
int main()
{
char ss[20];
scanf("%5s", ss);
puts(ss);
return 0;
}
scanf("%5s", ss)表示读取的字符串的最大长度为5,或者说,最多读取5个字符
运行结果:
如果长度不足5,也会结束输入,因为有换行符的存在
2、scanf匹配特定字符
scanf匹配特定字符的格式为:%[xxx],[ ]
包围起来的是需要读取的字符集合
例如:
char ss[10];
scanf("%[abcd]", ss);
%[abcd]
表示只读取字符abcd
,遇到其它的字符就读取结束(这句话是重点),如果abcd字符在字符串的中间部分那么就不能正常读取字符
测试不同输入的结果:
测试用例一:
(注意abcd的顺序没有要求,输入bcda,badc等是可以正常读入的)
测试用例二:
(只读取了ab字符,遇到z时就结束输入)
测试用例三:
(第一个字符是z结束输入,字符串未初始化输出为垃圾值)
匹配特定字符还有一种更简单的写法,比如要匹配所有小写字母,可以写成%[a-z],匹配所有大字字符,可以写成%[A-Z](需要注意的是左边的字符要小于右边的字符),利用这种写法可以很方便的完成一些特定输入的读取
读取所有的大小写字母
char ss[20];
scanf("%[a-zA-Z]", ss);
puts(ss);
上这种写法有一个缺点,就是如果大小写字母中间有其他字符的话就会直接结束输入,运行示例如下
测试用例一:(中间没有其他字符)
测试用例二:(中间有其他字符)
(这种情况就是之前说的了,中间出现了其他字符,就会结束输入)
为了解决上面这种情况,对上面的代码做一些修改,以解决空白符的情况,修改后代码如下
char ss[20];
scanf("%[a-z A-Z]", ss);
puts(ss);
其实就是在中间加一个空格,意思是空格也算匹配字符如果输入中有空格符也会被正常读取,运行效果如下
(需要注意的是,这条语句scanf("%[a-z A-Z]", ss)空格的位置不一定要放在中间,可以放在最前面scanf("%[ a-zA-Z]", ss),也可以放在最后面,scanf("%[a-zA-Z ]", ss))
如果输入的字母中间除了空格还有制表符(两者都算空白符),需要再加一个
scanf("%[a-z A-Z ]", ss);
运行效果:
如果想读取数字可以写成:
scanf("%[0-9]", ss);
3、不匹配某些字符(也可以叫过滤某些字符)
不匹配某些字符只需要在[ ]内的最前面加一个^就可以了,例如:
char ss[20];
scanf("%[^0-9]", ss);
puts(ss);
scanf("%[^0-9]", ss)表示匹配除0-9之外的所有字符,遇到到0-9的数字就结束输入,运行结果如下:
读者到这里可以发现,scanf函数可以用不匹配某些字符的写法来完全替代gets函数了,代码如下
char ss[20];
scanf("%[^
]", ss);
puts(ss);
scanf("%[^ ]", ss)的意思就是读取除换行符之外的所有字符(是不是和gets的功能一模一样了)
4、丢弃读取到的字符
scanf() 允许把读取到的数据直接丢弃,不往变量中存放,具体方法就是在 % 后面加一个*,例如:
scanf("%*[a-z]");
scanf("%*[a-z]")表示将读取到的小写字母丢弃
scanf("%*[0-9]");
scanf("%*[0-9]")表示将读取到的数字丢弃
代码示例:
char ss[20];
scanf("%*[a-z]");
scanf("%s", ss);
puts(ss);
运行效果:
这种写法有一个问题就是,在可读入字符后面如果还有符合丢弃条件的字符也会读取,而不会被丢弃,运行效果如下
(意思是这种丢弃只发生在不满足丢弃条件的第一个字符之前(这句话有点绕),以上面的这个例子来说,在大写字母ABCD之前的小写字母abcd的确被丢弃了,但是大写字母ABCD后面还有小写字母abcd,此时丢弃就不再起作用了)