| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 788 人关注过本帖
标题:大家看看我对scanf()的理解是否正确
只看楼主 加入收藏
zhaoyg
Rank: 1
等 级:新手上路
帖 子:328
专家分:0
注 册:2006-8-28
收藏
 问题点数:0 回复次数:10 
大家看看我对scanf()的理解是否正确

Given the input "Go west, young man!", what would each of the following programs produce for output? (The ! follows the space character in the ASCII sequence.)
#include <stdio.h>

int main(void)
{
char ch;

scanf("%c", &ch);

while ( ch != 'g' )
{
printf("%c", ch);
scanf("%c", &ch);
}
return 0;
}
这是c primer plus 5th 上的一个题,当我输入“Go west, young man!”后按回车,输出“Go west, youn”,我的问题不是为何不输出其后的“g man!”,而是为何在输入了所有的字符后按回车却显示了所有的字符(除了后面几个)。
我的理解是,当我输入G后再输入o时,scanf()将G发送给ch,而将o流到下一次的scanf(),简单的比喻一下就是scanf()将o当成了回车,将o前面的G发给ch。为了验证我的想法我有写了下面的程序:
#include <stdio.h>
#include<conio.h>
int main()
{
char ch1,ch2;
scanf("%c",&ch1);
scanf("%c",&ch2);
printf("%c %c",ch1,ch2);
getch();
return 0;
}
输入ab 回车
输出a b

望大家看看我是否理解的正确

搜索更多相关主题的帖子: scanf 
2007-03-17 15:23
moonwalker
Rank: 1
等 级:新手上路
威 望:1
帖 子:909
专家分:2
注 册:2007-3-2
收藏
得分:0 

不正确
因为你的判断条件是当输入字符不为g时“while ( ch != 'g' )”
所以遇到'g'的时候,跳出while循环


“视频教程网”免费提供教学资源
C不限制你的自由!
条件是自己承担滥用自由的恶果!
2007-03-17 16:00
yrj007
Rank: 1
等 级:新手上路
帖 子:43
专家分:0
注 册:2007-3-17
收藏
得分:0 
我的问题不在于while ( ch != 'g' ) ,而是关于scanf()的输入特性

2007-03-17 16:22
e4lich
Rank: 2
等 级:新手上路
威 望:4
帖 子:182
专家分:0
注 册:2006-10-26
收藏
得分:0 
我严证过的结果是,先输人o再输入g时,会输出o的,然后跳出循环,如果先输入g的话就直接退出循环!

我只想变强!     
2007-03-17 16:27
e4lich
Rank: 2
等 级:新手上路
威 望:4
帖 子:182
专家分:0
注 册:2006-10-26
收藏
得分:0 
可能我语文水平不高,真的不是很清楚你在说什么,不过肯定的是,scanf只能按照"%c"和你定义的参数来接收的,例如你的例子,你定了是字符,所以它只能一个一个接收,所以你连续输入两个,只能有一个留在下次咯,这也许就是你所说的scanf特性了吧!

我只想变强!     
2007-03-17 16:31
moonwalker
Rank: 1
等 级:新手上路
威 望:1
帖 子:909
专家分:2
注 册:2007-3-2
收藏
得分:0 
呵呵,看错了
我认为并不是把‘o’当成回车,而是根据你的输入格式读取
不过需要用回车来结束scanf函数,同时把多出的字符放在buff中
下次的scanf就直接从buff中按格式读取

“视频教程网”免费提供教学资源
C不限制你的自由!
条件是自己承担滥用自由的恶果!
2007-03-17 16:44
zhaoyg
Rank: 1
等 级:新手上路
帖 子:328
专家分:0
注 册:2006-8-28
收藏
得分:0 
我的问题是关于scanf()的输入特性。
如果回车用来结束scanf(),那当我输入“Go west, youn”后按回车应该是将整个“Go west, youn”语句赋给ch
而题的意思是将字符挨个输给ch,而输入g来结束循环。

麻雀飞上枝头变凤凰,而菜鸟的我飞上枝头却感冒了,为什么我的脑袋如此的不管用呢。
2007-03-17 17:40
moonwalker
Rank: 1
等 级:新手上路
威 望:1
帖 子:909
专家分:2
注 册:2007-3-2
收藏
得分:0 
以下是引用zhaoyg在2007-3-17 17:40:58的发言:
我的问题是关于scanf()的输入特性。
如果回车用来结束scanf(),那当我输入“Go west, youn”后按回车应该是将整个“Go west, youn”语句赋给ch
而题的意思是将字符挨个输给ch,而输入g来结束循环。

要知道,你的输入格式是%c,所以只能1个1个的读取,但是要输入回车才会开始读取,但是第一次只读取第一个字符
下一次读取时就不用回车,也是按照输入格式从刚才的地方接着读取


“视频教程网”免费提供教学资源
C不限制你的自由!
条件是自己承担滥用自由的恶果!
2007-03-17 17:46
zhaoyg
Rank: 1
等 级:新手上路
帖 子:328
专家分:0
注 册:2006-8-28
收藏
得分:0 
以下是引用moonwalker在2007-3-17 17:46:27的发言:

要知道,你的输入格式是%c,所以只能1个1个的读取,但是要输入回车才会开始读取,但是第一次只读取第一个字符
下一次读取时就不用回车,也是按照输入格式从刚才的地方接着读取

但是每读取一个字符都需要回车来读入,而我只按了一次回车,既然能读入所有字符那就说明先前的字符是被后一个字符“挤进”ch的,而最后一个字符的读入是靠回车


麻雀飞上枝头变凤凰,而菜鸟的我飞上枝头却感冒了,为什么我的脑袋如此的不管用呢。
2007-03-17 17:57
moonwalker
Rank: 1
等 级:新手上路
威 望:1
帖 子:909
专家分:2
注 册:2007-3-2
收藏
得分:0 
以下是引用zhaoyg在2007-3-17 17:57:13的发言:

但是每读取一个字符都需要回车来读入,而我只按了一次回车,既然能读入所有字符那就说明先前的字符是被后一个字符“挤进”ch的,而最后一个字符的读入是靠回车

不是被后一个字符挤的,而是整个字符串一起被回车“挤进”缓冲区,然后scanf依次从缓冲区里按一定格式读取
如果缓冲区里仍有合法的已输入字符,就不会让你再输入,再敲回车了


“视频教程网”免费提供教学资源
C不限制你的自由!
条件是自己承担滥用自由的恶果!
2007-03-17 20:11
快速回复:大家看看我对scanf()的理解是否正确
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.022958 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved