鱼C论坛

 找回密码
 立即注册
查看: 2831|回复: 5

c语言getchar与scanf问题

[复制链接]
发表于 2012-3-24 14:29:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 东风异客 于 2012-3-24 17:22 编辑
  1. #include <stdio.h>

  2. main()
  3. {
  4.       int a,b,c,d;
  5.       scanf("%c%c",&a,&b);
  6.       c=getchar();
  7.       d=getchar();
  8.       printf("%c%c%c%c",a,b,c,d);
  9. }
复制代码
此代码运行时输入:12<CR>
34<CR>
运行结果为:
12
3
scanf以enter作为输完的依据,getchar也以enter作为输完的依据。那为什么结果会是这样。
也就是说12被scanf读取,第一个CR被第一个getchar读取,3被第二个getchar读取,然后是4,然后遇到enter然后就结束了。
为什么作为scanf的结束标志的enter可以被接下来的getchar读入?这是什么原理。
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-3-24 17:57:59 From FishC Mobile | 显示全部楼层
getchar读入是字符型的,回车也是字符,
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-3-24 18:03:56 | 显示全部楼层
getchar()会把换行符也当作一个字符处理,12赋值给了ab,回车赋值给力c,3赋值给了d。
虽然回车是清空缓冲区,但是同时回车也是一个字符!
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-3-25 12:58:51 | 显示全部楼层
本帖最后由 仰望天上的光 于 2012-3-25 12:59 编辑

假设输入缓冲区初始为空,执行语句:
scanf("%c%c",&a,&b);
的时候,你输入:12<CR>
所以输入缓冲区里内容是:'1''2''\n'
把'1'给a,‘2’给b后输入缓冲区里还剩'\n'
接着
c=getchar();
把'\n'给c
接着
d=getchar();
等待你的输入。
你又输入了34<CR>
所以现在输入缓冲区里内容为:'3''4''\n'
d=getchar();
将3读给d
接下来输入缓冲区里还剩'4''\n'
不过你的程序后面只和输出有关,和输入没什么关系了,所以a,b,c,d的值如前面的分析。
小甲鱼最新课程 -> https://ilovefishc.com
 楼主| 发表于 2012-3-25 18:15:46 | 显示全部楼层

也就是说这个程序接受4个字符。
可是我输入123<CR>时结果又只显示123了。
小甲鱼最新课程 -> https://ilovefishc.com
发表于 2012-3-25 20:50:50 | 显示全部楼层
东风异客 发表于 2012-3-25 18:15
也就是说这个程序接受4个字符。
可是我输入123时结果又只显示123了。

假设输入缓冲区初始为空,执行语句:
scanf("%c%c",&a,&b);
的时候,你输入:123<CR>
所以输入缓冲区里内容是:'1''2''3''\n'
把'1'给a,‘2’给b后输入缓冲区里还剩'3''\n'
接着
c=getchar();
把'3'给c
接着
d=getchar();
把'\n'给d。
小甲鱼最新课程 -> https://ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-2-14 17:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表