A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

举个例子,请自动忽略未写部分:
一、在scanf函数中混合输入
int a = 0,b = 0;
char c = 'a';
scanf("%d%c%d",&a,&c,&b);
printf("%d,%c,%d",a,c,b);
如果我们输入11空格a空格13那么打印的是11,空格,0。
二、在scanf函数中输入全整型
int a = 0,c = 0,b = 0;
scanf("%d%d%d",&a,&c,&b);
printf("%d,%d,%d",a,c,b);
如果我们输入11空格12空格13那么打印的是11,12,13。
问题:
是不是说在混合输入时系统自动把a识别成整型输入到第二个%d里?如果是,为什么在全是int类型有空格、回车、tab时系统不会自动把空格、回车识别成整型输入?如果不是为什么在混合输入时会出现这种情况?也就是说为什么在全整型中系统会自动识别不是整型的空格,把这个不是整型的空格忽略掉进而输入下一个用户输入的整数,在混合输入中第二个整型却不会识别不是整型的a而直接输入a导致结果显示初始数据?

9 个回复

倒序浏览
本帖最后由 alanwangke213 于 2015-7-23 14:45 编辑

在C函数库中有个isalpha函数,他会判断你输入的格式的内容,你的scanf这种格式化输入,必须按照格式来,你加上个逗号就应该不会有问题了。你第一个题目中的scanf里面11存储在a中,空格被存储在c中。因为这些在存储中都是以ASCII码存储的,空格也是字符。‘a’存储在b中,存储内容为01100001,但是输出的格式为int型,不正确,除非你将字符a强制类型转换成int型才可以输出正确。
回复 使用道具 举报
alanwangke213 发表于 2015-7-23 14:44
在C函数库中有个isalpha函数,他会判断你输入的格式的内容,你的scanf这种格式化输入,必须按照格式来,你 ...

这些老师也说过,我就是有个疑问,为什么全整型时会自动忽略不是整型的字符,而混合输入就不会忽略而是把a强制转换成整型了。为啥全整型时它不强制转换?
回复 使用道具 举报
李海贤 发表于 2015-7-23 14:53
这些老师也说过,我就是有个疑问,为什么全整型时会自动忽略不是整型的字符,而混合输入就不会忽略而是把 ...

因为系统调用isalpha函数,判断你输入的字符串中每个字符是什么类型的。
全整形的话他只会读取整数字符 ‘1’ ‘2’ ‘3’。。。‘0’,空格的ascii不在这个范围中,所以不会读取。但是如果中间读取了字符型,那么空格被读取并存储,而后面一位又是读取整形,但是你输入的字符串下一位是a,与你scanf格式不符合,所以,其实b并未赋值,b的值还是初始的0、后面的字符a空格13还在缓冲区中。
这种格式化输入输出,要求严谨的输入格式。
回复 使用道具 举报
alanwangke213 发表于 2015-7-23 15:01
因为系统调用isalpha函数,判断你输入的字符串中每个字符是什么类型的。
全整形的话他只会读取整数字符  ...

呃。。。新人,不懂什么是isalpha,估计等学了这个问题就迎刃而解了,非常感谢
回复 使用道具 举报
这个你可以不用管,他只是用来判断你输入的字符串的字符进行识别,要是输入数字就在0-9之间,字符就是后面的所有ascii都算的,你可以吧空格改成!什么的试一下就会发现,输出11!0。因为这些符号(包括空格)都可以用%c来输出和输入的。
回复 使用道具 举报
李海贤 发表于 2015-7-23 15:07
呃。。。新人,不懂什么是isalpha,估计等学了这个问题就迎刃而解了,非常感谢 ...

我也要去黑马,技术分怎么赚啊。。帮我的回答评个分吧。谢谢啦~

点评

别想太多,老老实实每天登录回帖五个,发帖五个赚黑马币就行  发表于 2015-7-26 21:34
回复 使用道具 举报
顶贴顶贴
回复 使用道具 举报
用符号连接或者用%c吸收多余空格
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马