黑马程序员技术交流社区

标题: scanf函数 [打印本页]

作者: 欢子    时间: 2015-7-14 10:14
标题: scanf函数
在scanf中输入字符型和整数混合时再用printf打印出来,输入得数和打印的为什么不一样。例如 int a,b=1 ; char ch; scanf("%d%c%d",&a,&ch,&b); printf("d%,c%,d%",a,ch,b);  如果键盘输入10 y 8,然后回车打印出的确实10 '  '  1 ,,求大神给解释下为什么。
作者: 我丶就这样    时间: 2015-7-14 11:07
这样输入,第二个字符变量接收的是回车  而不是你输入的y
作者: 泡泡龙    时间: 2015-7-14 12:13
本帖最后由 泡泡龙 于 2015-7-14 12:15 编辑

空格也是字符哦,它被第二个接受了,而第三个不能接受y,所以输出的值还是原来的值1
作者: 983616547    时间: 2015-7-14 13:05
空格被当做字符处理了,更改为scanf("%d,%c,%d",&a,&ch,&b); printf("d%,c%,d%",a,ch,b);  键盘输入10,y,8
作者: 欢子    时间: 2015-7-14 13:11
[quote]983616547 发表于 2015-7-14 13:05
空格被当做字符处理了,更改为scanf(

嗯嗯,OK了
作者: 欢子    时间: 2015-7-14 13:12
泡泡龙 发表于 2015-7-14 12:13
空格也是字符哦,它被第二个接受了,而第三个不能接受y,所以输出的值还是原来的值1 ...

嗯嗯,多谢多谢
作者: wxh794708907    时间: 2015-7-14 13:59
这是第二天里面的视频吧 我做了笔记 看了笔记你就懂了 scanf的注意事项:1 scanf函数遇到回车的时候,会结束执行                   2 接收当个变量值的时候,再输入值之前,如果我们输入了空格 回车 tab 都会被忽略;                  3 %d%d表示输入两个十进制整数 中间不用逗号隔开 ;要求我们在键盘上输入的时候,输入两个整数                  4 并且以空格或者回车隔开不能在中间使用逗号或者其他符号,如 12  34 ;当输入完一个数以后,如果中间添加了回车 空格 tab都会被忽略;                  5 如果是多个格式控制符混合输入 是 如 scanf(“%d%c%d”,&a,&ch,&b)这是在%d%c%d的中间就必须加入逗号 而且再输入的时候也必须中间加逗号输入                    否则输入会出错;                              6 scanf(“%d%*d%d”,a,b,c)这个%*d表示这个数不会输入 会跳过;                   scanf运行的原理:1.当用户输入内容以后,用户输入的内容会被存放到scanf的输入缓冲区中,然后,scanf函数会根据格式控制的字符的要求,送输入缓冲区一次取它想要的内容,                    如果 从缓冲区中取得内容和我们的格式要求一致,则把值存放到变量中;如果格式不一致,则不修改变量的值;                  2.如果scanf缓冲区中还有内容,则scanf不会提示我们再次输入  例如 :scanf(”%d%c%d“,&a,&ch,&b)加入你输入12 空格 a 空格 45 ;它会依次取值12 空格 和a 但是a是字符不是%d格式,                    格式不相符就不会取值了;                    int a=1 b=-1                   char ch=‘a’                  scanf("%d",&a);                  scanf("%c",&ch);                  scanf("%d",&b);                  printf("%d,%c,%b",a,ch,b);                  如果你想要输出a=12 ch为a b为45;这时候如果你直接输出三次 12 a b 不会显示出来因为scanf中的缓冲区中有五个中间包括了两个enter 如果想要按理想的输出三个数                  可以在scanf("%c",&ch);下面在输入一次scanf("%c",&ch);这样scanf("%c",&ch)就会吸收掉中间的那个空格 b也会直接在缓冲区中找到45这个整数而忽略掉中间的那个空格;                                             
作者: 紫荆秋雪    时间: 2015-7-14 17:39
标题: scanf函数小结
本帖最后由 紫荆秋雪 于 2015-7-14 18:52 编辑

推荐输入格式:
#include <stdio.h>
int main()
{
    int a,b;
    char ch;
    scanf("%d,%c,%d",&a,&ch,&b);
    //scanf("%c",&ch);
    //scanf("%d",&b);
    printf("%d,%c,%d",a,ch,b);
}
输入格式 1,y,1

作者: 欢子    时间: 2015-7-14 20:10
wxh794708907 发表于 2015-7-14 13:59
这是第二天里面的视频吧 我做了笔记 看了笔记你就懂了 scanf的注意事项:1 scanf函数遇到回车的时候,会结 ...

谢谢,笔记做的真棒。
作者: 欢子    时间: 2015-7-14 20:12
紫荆秋雪 发表于 2015-7-14 17:39
推荐输入格式:
#include
int main()

谢谢你呢!!!!!
作者: 紫荆秋雪    时间: 2015-7-14 20:56
欢子 发表于 2015-7-14 20:12
谢谢你呢!!!!!

因为我是新手,不怎么会用这个平台,我总结了scanf函数的一些用法及其注意事项,还配有例子,但是好像太多了在这里不能发,我正准备放到日记中,不清楚可不可以,到时你可以看看,希望对你有帮助。
作者: 小蜗牛0519    时间: 2015-7-14 21:28
10 和y之间有了空格被第二个字符接收了
作者: 糖糖本尊    时间: 2015-7-14 21:36
空格被当成字符接受了  所以会出现这样 正确的scanf("%d,%c,%d",&a,&ch,&b); printf("d%,c%,d%",a,ch,b); %后面加逗号就好了
作者: 紫荆秋雪    时间: 2015-7-14 21:40
紫荆秋雪 发表于 2015-7-14 20:56
因为我是新手,不怎么会用这个平台,我总结了scanf函数的一些用法及其注意事项,还配有例子,但是好像太 ...

你可以看看我总结的scanf函数
http://bbs.itheima.com/thread-213520-1-1.html
作者: 卖毛玉的小贩    时间: 2015-7-14 21:54
= =一群大神啊,虽然会,但一看,感觉也有漏点的没看···
作者: 飞哥    时间: 2015-7-14 22:01
        很给力!期待楼主讲讲来黑马第一周的事情
作者: 欢子    时间: 2015-7-15 11:32
紫荆秋雪 发表于 2015-7-14 20:56
因为我是新手,不怎么会用这个平台,我总结了scanf函数的一些用法及其注意事项,还配有例子,但是好像太 ...

现在懂了,很感谢你,希望以后多多交流
作者: 欢子    时间: 2015-7-15 11:33
飞哥 发表于 2015-7-14 22:01
很给力!期待楼主讲讲来黑马第一周的事情

我还去呢,正在自学,报了八月的黑马双元
作者: 欢子    时间: 2015-7-15 11:34
飞哥 发表于 2015-7-14 22:01
很给力!期待楼主讲讲来黑马第一周的事情

我还去呢,正在自学,报了八月的黑马双元
作者: 欢子    时间: 2015-7-15 11:35
卖毛玉的小贩 发表于 2015-7-14 21:54
= =一群大神啊,虽然会,但一看,感觉也有漏点的没看···

我可是渣渣:'(自学中,报的八月分的双元班
作者: 卖毛玉的小贩    时间: 2015-7-15 21:43
欢子 发表于 2015-7-15 11:35
我可是渣渣自学中,报的八月分的双元班

我是七月双元,八月毕业额···
作者: Mal    时间: 2015-7-15 22:25
空格也是一个字符,在使用scanf函数式尽量避免整型和字符型的混合输入,如果非要这样输入可以使用“,”(逗号)隔开  如scanf(”%d,%c,%d“,&a,&ch,&b);
作者: 午夜码农    时间: 2015-7-16 07:10
("控制字符串",变量列表),填写控制字符串时候你加个逗号,在控制台输入时候同样以逗号隔开。PS:scanf()函数与printf()你可以想象在内存中执行某一个函数时划分了不同的缓存区,输入缓存区以你的为例子:scanf("%d%c%d",&a&ch&b)在内存中存储:第一个是%d:&取地址,第二是空格(因为空格也是个字符),第三个是int b,自动转义成char类型输出,以此类推。。
作者: 爱马尚    时间: 2015-7-16 07:15
空格也是一个字符哦,y就当成int型使用了
作者: 卖毛玉的小贩    时间: 2015-7-16 08:50
啊啊啊,感觉还是面授好
作者: 被水淹死的鱼    时间: 2015-7-16 10:04
缓存中有空格,你换成都好应该就可以了
作者: 王博Lynn    时间: 2015-7-16 10:27
空格也是字符,接收了空格放进了ch
作者: 丁铭检    时间: 2015-7-17 16:42
你这是连续输入。。。在键盘输入的时候注意不要打空格或换行。。
作者: wxh794708907    时间: 2015-7-17 16:55
scanf("%d,%c,%d",&a,&ch,&b)这样写 输入的时候也要用逗号隔开10,y,8
作者: Thomas-王    时间: 2015-7-17 21:24
三楼正解         
作者: 黑马灬小胖纸    时间: 2015-7-17 21:58
空格被scanf吸收了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2