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

为什么C语言里面scanf("7.2f")无意义?

发布网友 发布时间:2024-05-02 02:40

我来回答

1个回答

热心网友 时间:2024-12-11 17:48

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

原问题是“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
word文档怎么设置页码word怎么从中间开始设置页码 《祖宗模拟器》如何长寿长寿技巧分享 祖宗模拟器答案大全,你知道吗。 祖宗模拟器答案大全,哪位有? 宝石种类分为哪几类? 表格怎么自动排序号excel表格中自动生成序号技巧 表格如何自动排序仅需4步让Excel表格自动排序的方法 1.5匹富士空调电脑板开机就烧保险丝 为什么 修空调只是把拆了个压敏电阻,虽然可以运行,但这样没问题吗? 1.5富士空调电脑板一通电就烧保险丝为什么 vs 2013输出的第二个值有问题 "warning C4996: “scanf”被声明为否决的" 怎么解决? 小白c语言入门,请教大神这是什么原因? 没领结婚证,有办酒席,并有视频为证!离婚时,女方权利受法律保护吗? 玉山县高新技术产业园区管委会好吗 在西安太元路去电子四路坐几路公交车 中亚雅高美爵行政酒廊怎么样 庾信《哀江南赋序》逐句详细注释 花呗突然提额怎么回事 顺平到五台山 《富春山居图》的创作背景与评价 黄公望《富春山居图》赏析 临泉路和肥西路到皖江路打车多少钱 ...有没有谁做过视力矫正手术的?两年后感觉怎么样? 重庆国画院的文化建设 朝阳泰达电力有限公司怎么样? 恩施市泰达电力安装工程有限责任公司怎么样? 盐城市泰达电力科技有限公司怎么样 大连博翔北园37号楼是什么小区 广汉到西安多少公里 剖腹产百科全书 得安息与得享安息区别 ...现在到了谈婚论嫁的时候了,她家要12万的彩礼,三金,算不 ...分别表示什么数字?请简单说出理由,是阿拉伯数字。 湖南ETC怎么办理 湖南ETC办理流程 忽远忽近住摸不定是什么感 对方忽远忽近是怎样的体验? 忽远忽近是什么意思? acfun上流鼻血的图标是什么意思 江畔社区位于哪个市 广东省肇庆市高要区南岸沿江二路6号江畔湾花园属于哪个社区_百度... 南岸翔龙江畔属于哪个社区 讨厌猫狗之类的动物想起毛茸茸的就害怕,怎么回事 卤肉白芷是什么意思? 明目地黄丸 能和 玄麦甘桔颗粒 一起服用吗?我阴虚火旺,眼睛干涩 怀孕一个月,会时不时心慌,还经常头晕怎么办 我怀孕一个月了,老觉得头晕是什么问题 ...另一笔不在执行范围的款一并划拨其他人,我该怎么要回这笔钱_百度... 法院分配给原告执行款后发现还有其他受益人想要追回执行款怎么办 法院强制执行后知道给对方多给了钱,多给的钱怎样要回来