| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1028 人关注过本帖
标题:[求助]关于SCANF的一个费解的问题.
只看楼主 加入收藏
monomania
Rank: 1
等 级:新手上路
帖 子:68
专家分:0
注 册:2007-10-16
收藏
 问题点数:0 回复次数:15 
[求助]关于SCANF的一个费解的问题.

两段程序,大家可以复制下去执行一下:
程序一:
#include"stdio.h"
void main()
{ char a,b;
scanf("%c",&a);

while(a!='/')
{
printf("%c",a);
scanf("%c",&a);
}

getchar();
getchar();

}
程序二:
#include"stdio.h"
void main()
{ char a,b;
scanf("%c",&a);

while(a!='/')
{
printf("%c",a);

}

getchar();
getchar();

}
需要注意的是:转换字符为%c.单个字符.现在问题就出来了:
先执行程序二,如果执行时输入一个字符串,如ABCDF,则输出时只不停地输出A.后面的则不输出.这个好理解
但在程序一中,执行时,却能正常执行,即如果输入字符串ABCDF,则输出时能输出ABCDF.请问这是为什么呢?
请知道的给出详细的解答.谢谢.

搜索更多相关主题的帖子: SCANF 
2007-10-18 09:54
davidloves
Rank: 1
等 级:新手上路
帖 子:137
专家分:0
注 册:2007-1-6
收藏
得分:0 
以下是引用monomania在2007-10-18 9:54:11的发言:

两段程序,大家可以复制下去执行一下:
程序一:
#include"stdio.h"
void main()
{ char a,b;
scanf("%c",&a);

while(a!='/')
{
printf("%c",a);
scanf("%c",&a);
}

getchar();
getchar();

}
程序二:
#include"stdio.h"
void main()
{ char a,b;
scanf("%c",&a);

while(a!='/')
{
printf("%c",a);

}


getchar();
getchar();

}
需要注意的是:转换字符为%c.单个字符.现在问题就出来了:
先执行程序二,如果执行时输入一个字符串,如ABCDF,则输出时只不停地输出A.后面的则不输出.这个好理解
但在程序一中,执行时,却能正常执行,即如果输入字符串ABCDF,则输出时能输出ABCDF.请问这是为什么呢?
请知道的给出详细的解答.谢谢.

第一个while 里面,打印一个然后又读入一个,当然可以一直打印了呀,但是一直不能退出循环,除非你输入‘/’
不知道lz哪里没明白


2007-10-18 10:15
monomania
Rank: 1
等 级:新手上路
帖 子:68
专家分:0
注 册:2007-10-16
收藏
得分:0 
感谢.你说的逻辑我是清楚.但我不明白的是,进入WHILE循环以后,scanf函数是怎么样读入数据的?我想知道的是读入数据的具体过程,因为此前我并不知道scanf函数可以这么用.
盼回复..
谢谢

不好意思我只是想明白真相
2007-10-18 10:32
davidloves
Rank: 1
等 级:新手上路
帖 子:137
专家分:0
注 册:2007-1-6
收藏
得分:0 

比如你输入了abcd然后敲了回车
首先当然是读入a 了,打印a以后
读入b,打印b
读入c,打印c
读入d,打印d
读入'\n',打印'\n'

然后等待继续输入

不知道你想要得是不是这个


2007-10-18 10:51
monomania
Rank: 1
等 级:新手上路
帖 子:68
专家分:0
注 册:2007-10-16
收藏
得分:0 

这么看来,scanf 的作用应该就是将输入流中的字符按照转换字符的要求给读出来,比如%c就是将字符一个挨着一个读出来.
我的理解就是这样,不知道是不是准确的?


不好意思我只是想明白真相
2007-10-18 11:02
永夜的极光
Rank: 6Rank: 6
等 级:贵宾
威 望:27
帖 子:2721
专家分:1
注 册:2007-10-9
收藏
得分:0 
是这样的,我们通过键盘输入的时候,输入的内容会先放入缓冲区,

然后scanf从缓冲区读取,每次读取到有效的值,就会把读取的内容从缓冲区去除,

下次调用scanf时,如果缓冲区还有内容,就只会读缓冲区的内容,不会再要求输入。

使用fflush(stdin);语句可以清除缓冲区的内容

从BFS(Breadth First Study)到DFS(Depth First Study)
2007-10-18 11:11
monomania
Rank: 1
等 级:新手上路
帖 子:68
专家分:0
注 册:2007-10-16
收藏
得分:0 
谢谢谢谢
以后还请多多指教.

不好意思我只是想明白真相
2007-10-18 11:20
lxm520910
Rank: 1
等 级:新手上路
帖 子:96
专家分:0
注 册:2007-10-3
收藏
得分:0 
小弟有个问题:a是char型,那么a也就只能存放一个字符。一次输入abcde,也就只读取a了,输出也就是a了。看怎么输出的是abcde呢?那个scanf是怎么读取输入字符的呢?   大虾们给指教下
2007-10-18 11:27
远去的列车
Rank: 1
等 级:新手上路
威 望:2
帖 子:205
专家分:0
注 册:2007-8-7
收藏
得分:0 

用字符串

char a[20];
scanf("%s",a);
printf("%s\n",a);


C++学习
2007-10-18 11:42
monomania
Rank: 1
等 级:新手上路
帖 子:68
专家分:0
注 册:2007-10-16
收藏
得分:0 

读取字符的取决于转换格式符:
如scanf("%s",a);则是将输入的整串字符都读取.
如scanf("%c",a).则读取的是单个字符.


不好意思我只是想明白真相
2007-10-18 13:25
快速回复:[求助]关于SCANF的一个费解的问题.
数据加载中...
 
   



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

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