在前面一篇文章中介绍了scanf的基本使用方法,这篇文章继续介绍一些稍微冷门的有用知识点,两篇文章结合起来基本上能够大体掌握scanf的使用方式。
- scanf的基本使用方法
- 格式化输入的完整格式
- 示例1: 指定输入长度
- 示例2: 正则匹配指定字符进行输入
- 示例3: 使用-简化正则输入
- 示例4: 使用^的正则方式控制输入
- 示例5: 使用*丢弃指定字符
- https://liumiaocn.blog.csdn.net/article/details/109234543
完整格式:%[*] [宽度]类型
类型在在基本使用方法中已经详细介绍过,这里不再赘述,本文重点通过示例介绍一下宽度等可选选项的设定方法。
示例1: 指定输入长度printf中可以通过设定输出长度对输出进行控制,实际scanf中也有同样类似的方式,比如如下使使用示例:
#include int main() { int i=0; float f=0; char str[10]={0}; scanf("%3d",&i); scanf("%3f",&f); scanf("%3s",str); printf("[i=%d]\n",i); printf("[f=%f]\n",f); printf("[s=%s]\n",str); return 0; }
输出结果示例1
12 1.1 lm [i=12] [f=1.100000] [s=lm]
输出结果示例2
123456 1.234 [i=123] [f=456.000000] [s=1.2]
对于输出结果示例2的输出可能会觉得很奇怪,实际上这又是缓冲区在作怪,再次祭出fflush,立即药到病除, 比如示例代码可以进行如下修改
#include int main() { int i=0; float f=0; char str[10]={0}; scanf("%3d",&i); fflush(stdin); scanf("%3f",&f); fflush(stdin); scanf("%3s",str); printf("[i=%d]\n",i); printf("[f=%f]\n",f); printf("[s=%s]\n",str); return 0; }
执行示例结果如下
123456 1.234 liumiao [i=123] [f=1.200000] [s=liu]示例2: 正则匹配指定字符进行输入
比如对于十六进制的小写方式的输入控制可以使用如下代码
#include int main() { char str[40] = { 0 }; scanf("%[0123456789abcdef]",str); printf("[%s]\n",str); }
示例输出如下
123476259802fedabcliumiao [123476259802fedabc]
知识点说明:
- 能够输入的字符为[]中指定的,此写法与普通的正则相同,输入的顺序不限
- 遇[]中没有指定的字符终止输入
比如上述内容可以通过是用-来简化输入,此种方式也是普通的正则写法,示例代码如下
#include int main() { char str[40] = { 0 }; scanf("%[0-9a-f]",str); printf("[%s]\n",str); }
示例输出如下
123476259802fedabcliumiao [123476259802fedabc]示例4: 使用^的正则方式控制输入
同样^的正则写法同样可以使用,这里再举一个简单有趣的输入方式,scanf是否能够输入带空格的字符串,比如将liu miao一次放入到一个字符串数组中,普通方式使用%s自然遇空格即结束,但是使用如下方式可以解决此问题(除了回车之外的内容都可以输入,非常像在C99中被除名的gets函数)
#include int main() { char str[40] = { 0 }; scanf("%[^\n]",str); printf("[%s]\n",str); }
示例输出如下
liu miao [liu miao]示例5: 使用*丢弃指定字符
*在scanf中与一般的通配符的*稍微还是有点差异,比如这里同一个示例来加深理解:获取以空格隔开的句子中的第三个单词,示例代码如下
#include int main() { char str[40] = { 0 }; scanf("%*s %*s %s",str); printf("[%s]\n",str); }
执行示例代码如下
this is liu miao speacking [liu]