问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

C语言,语句scanf("","");

发布网友 发布时间:2024-01-12 04:25

我来回答

1个回答

热心网友 时间:2024-11-02 03:11

首先,这个语句显然是有问题的,但是能编译通过,说明是合法的。那么我们就需要弄清楚编译器是怎么理解这条语句的,以及运行时这条语句做了什么。

原问题是“C语言,语句scanf("7.2f",&a);是一个合法的scanf函数?”,我猜测这里"7.2f"应该问的是"%7.2f",但是也可能就是"7.2f",所以对这两种情况均进行分析。

网上说“使用scanf函数对实型变量进行赋值时,在格式%f中不得控制小数位的精度,但在printf函数中可以使用,并且经常使用”,因此"%7.2f"用在scanf里面,肯定是不对的。

问题1:百分号要用"%%"表示,那么单独一个"%"有什么作用呢?

测试1:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    printf("%");
    return 0;
}

结果:无任何输出。说明单独一个"%"是没有作用的,会被自动忽略。

但是,这个单独的"%"是否会对后面产生影响呢?

测试2:

#include <stdlib.h>
int main()
{
    printf("%\\\\\\\\\\");  //10个'\'
    return 0;
}

输出"\\\\\",说明虽然有单独的"%",但是不会对后面产生影响。

但是进行到这里,好像不知道再从何入手了,所以我们换一个角度研究。

我们知道:

问题2:scanf("123")有没有用?

因为没有给任何变量赋值,所以看起来这条语句不起任何作用,好像有没有都一样,但是下面一个程序就可以证明,这条语句的有无会对运行结果产生影响。

测试3:

输入为"123"

#include <stdio.h>
#include <stdlib.h>
int main()
{
    freopen("C:\\1.txt", "rb", stdin);  //输入流重定向,为了避免回车产生不必要的影响
    scanf("123");  //增加或删除这条语句
    int ch = getchar();  //向后读一个字符
    printf("%u\n", ch);
    printf("%d\n", feof(stdin));  //若不是0,证明到达文件尾
    return 0;
}

运行结果:

有scanf("123")时,输出:

没有scanf("123")时,输出:

这时候大概可以猜到了,scanf("123")是有作用的,它的作用是一个字符一个字符地匹配,将缓冲区里的'1'、'2'、'3'依次读出来。

这时候我们就可以回答scanf("7.2f", &a)的作用了。如果缓冲区下一个字符是'7',那么就继续向后读'.'、'2'等。虽然读出来了,但是不赋给任何一个变量,所以&a是多余的。不过虽然多余,但是编译器不用它就行了,所以对编译器来说是合法的,最多只是给出警告。

问题3:编译器如何理解scanf("%7.2f")

上面的讨论给了我们启示。所以虽然这里我没有什么好的想法,但是因为百分号是多出来的,根据排列组合,编译器可能有以下几种理解方式:

根据上面的讨论提供的方法,我们可以逐个测试。

对于代码:

#include <stdio.h>
#include <stdlib.h>
int main()
{
    freopen("C:\\1.txt", "rb", stdin);
    scanf("%7.2f");
    int ch = getchar();
    printf("%u\n", ch);
    printf("%d\n", feof(stdin));
    return 0;
}

输入".2f",运行结果:"4294967295\n16\n",由此可知,上述C是正确答案。

--------------------------------------------

总结:

语句scanf("7.2f", &a)是合法的,而且是有实际意义的。它的作用是一个字符一个字符地匹配,将缓冲区里的'7'、'.'、'2'、'f'依次读出来。

语句scanf("%7.2f", &a)也是合法的,而且也是有实际意义的。其中"%7.2f"相当于".2f",它的作用是一个字符一个字符地匹配,将缓冲区里的'.'、'2'、'f'依次读出来。

上述两条语句中,&a都是合法的,但是是没有作用的。

--------------------------------------------

P.S.:C语言有平台差异,不同平台运行结果可能不一样。

以上。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
脚崴了挂什么科、急急急 linux 解压缩工具--tar命令 生日祝福语闺蜜 简短独特暖心 QQ有哪些隐藏的图标??他们分别是什么??怎么样点亮?? QQ业务的各种图标怎么点亮? qq怎么点亮图标和名字 诗中书万象=求下联 大爱如山藏万象下联 中国电子展:电位器和可调电阻的区别是什么?这四点很明显 电位器的接线方法是什么 电位器的工作原理如何 原始wxid怎么加好友 ...我们这有宾馆做包子 用客人吃剩的菜 会传染病菌吗 黄磊孙莉为14岁多多庆生,孩子的成长父母陪伴多重要? 索尼相机RX100M7的硬件测评如何?能否应用于户外拍照? 微信手机号在24小时内,已绑定两个,已达到限制,不能在绑定其他微信... 乔木是针叶林还是阔叶林 中国考试难度最大的省份排名是什么 壁挂炉待机状态是什么意思 索尼DSC-RX100 数码相机与佳能G9X哪个好 晚上戴着耳塞睡觉对健康有害吗? 喝黑豆粉红豆粉上火吗 修改一年内如何二次修改吗苹果 研究生入学报到需要毕业证学位吗?要是已取得入学资格,但因挂科等原因没... 第九大陆的乱入是一开始就可以进去了吗? 小产权房更名过户的步骤 县委大院在撮镇哪里拍 一个手机号怎么弄两个 万家乐壁挂炉睡眠模式还工作吗 请问经常吃剩菜会得什么病 开福区办健康证在哪里办 一年内第二次修改技巧 今年湖北高考与其它省份相比难度怎样? 装修贷办不下来什么原因 四年级作文自己设定节日 万科签约中心工作怎么样 劝别人不要骄傲自满,因为世界上还有比他强的人的诗句 Mastercam 串联箭头显示不出来? 体检结果疲劳.怎么办 索尼a6400m对比7哪个效果好? 索尼相机RX100M7拍出的照片质量如何? 一个手机怎么申请两个 不到一年怎么改第二次 不到一年怎么改第二次 您的手机号在最近24小时内绑定过三个,已达到限制,...24小时后... 什么叫过表达载体? vivo y17手机中病毒了该怎么办 微信商户提现是免费的吗 一年内怎么改第二次 rx100m7能拍Rar格式照片吗? 被人害 还反咬一口 成语