Scanf()读取失败 您所在的位置:网站首页 复制的函数识别不出来怎么办呀 Scanf()读取失败

Scanf()读取失败

2024-06-29 05:15| 来源: 网络整理| 查看: 265

【实例2】scanf() 读取失败: #include int main(){ int a, b=999; char str[30]; printf("b=%d\n", b); scanf("%d", &a); scanf("%d", &b); scanf("%s", str); printf("a=%d, b=%d, str=%s\n", a, b, str); return 0;} 运行结果:

b=999100 http://c.biancheng.net↙a=100, b=999, str=http://c.biancheng.net

程序执行到第一个 scanf() 时等待用户输入,从键盘输入 100 http://c.biancheng.net ,按下回车键,scanf() 匹配到 100,赋值给变量a,同时将内部的位置指针移动到 100 后面。 到了第二个 scanf(),缓冲区中有数据,会直接读取。此时缓冲区中的内容为 http://c.biancheng.net↙ ,即使忽略开头的空格也不是 scanf() 想要的整数,所以匹配失败了,不会给变量 b 赋值,b 的值保持不变,这就是两次输出变量 b 的值相同的原因。 匹配失败意味着不会移动内部的位置指针,此时缓冲区中的内容仍然是 http://c.biancheng.net↙ 。执行到底三个 scanf() 时,它想要一个字符串,这不是正好捡漏吗,把 http://c.biancheng.net 赋值给 str 就好了。

注意,scanf()、gets() 在读取字符串时会忽略换行符,不会把换行符作为字符串的内容。

不能忽略空白符的情形: #include int main(){ int a = 1, b = 2; scanf("a=%d", &a); scanf("b=%d", &b); printf("a=%d, b=%d\n", a, b); return 0;} 输入示例:

a=99↙a=99, b=2

输入a=99,按下回车键,程序竟然运行结束了,只有第一个 scanf() 成功读取了数据,第二个 scanf() 仿佛没有执行一样,根本没有给用户任何机会去输入数据。这是为什么呢?第一个 scanf() 执行完后,将 99 赋值给了 a,缓冲区中只剩下一个换行符\n;到了第二个 scanf(),发现缓冲区中有内容,但是又不符合控制字符串的格式,于是尝试忽略这个空白符。注意,这个时候的空白符是不能忽略的,所以就没有办法了,只能读取失败了。实测发现,空白符在大部分情况下都可以忽略,前面的两个例子就是这样。但是当控制字符串不是以格式控制符 %d、%c、%f 等开头时,空白符就不能忽略了,它会参与匹配过程,如果匹配失败,就意味着 scanf() 读取失败了。本例中,第二个 scanf() 的开头并不是格式控制符,而是写死的a字符,所以不会忽略换行符,而换行符和a又不匹配,怎么办呢?没办法,只能读取失败了。如果我们换一种输入方式呢?

a=99 b=200↙a=99, b=2

你看,第二个 scanf() 也读取失败了。执行到第二个 scanf() 时,缓冲区中剩下 b=200↙,开头的空格依然不能忽略,然而又和控制字符串不匹配,所以只能读取失败了。两种输入方式都不行,究竟该如何输入呢?很简单,不要让两份数据之间有空白符,只能像下面一样输入:

a=99b=200↙a=99, b=200

这样 a 和 b 都能够正确读取了。注意,a=99b=200中间是没有任何空格的。最后,我们再修改一下上面的代码,将第二个 scanf() 改成下面的样子: scanf("%d", &b); 运行结果:

a=100↙200↙a=100, b=200

此时,第二个 scanf() 的控制字符串以 %d 开头,就可以忽略换行符了。忽略换行符以后,缓冲区中就没有内容了,所以会等待用户输入。输入 200 以后,第二个 scanf() 就匹配成功了,将 200 赋值给变量 b。 那么,为什么只有当控制字符串以格式控制符开头时,才会忽略换行符呢?我也觉得这个特性很奇怪,目前还未想明白,也没有资料可查,请读者先记住这个结论。


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有