关于getchar和putchar

beersheep 2007-11-17 08:34:38
请教各位老大,getchar和putchar是不是有一种类似queue的储存机制啊,在用户按下enter前,将所有读取的char放到一个queue中,在用户输入enter后再输出
比如这个函数:
#include <stdio.h>
#include <ctype.h>

#define TRUE 1
#define FALSE 0

int main(int argc, char *argv[]) {

int ch;
int endSentence;

endSentence = TRUE;
while ((ch = getchar()) != EOF) {
if (isalpha(ch) && endSentence) {
ch = toupper(ch);
endSentence = FALSE;
} else if (ch == '.') {
endSentence = TRUE;
}
//printf("%c", (char)ch);
putchar(ch);
}

return 0;
}
虽然在while结构中是读取了一个char立马输出(putchar),但是运行结果却是用户按下enter后将所有的char一并输出(将每句的第一个char大写)

如果我在putchar前面加入一行printfprintf("%c", (char)ch); 那么输入的不仅是每个char都双倍,而且还会在所有char都输出后继续输出一空行,这个空行又是哪里来的呢?小弟百思不得其解,特来请教各位老大,还有我对getchar和putchar的储存queue猜想是不是正确的呢?
...全文
524 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Treazy 2007-11-18
  • 打赏
  • 举报
回复
>>但是,如果我是在一行输入的结尾按下Ctrl+z再按回车,程序输出前面的字符,但并不结束,我还可以继续输入,只不过这次的输入没有换行,在程序输出的后面立即执行,这又是为什么呢?

如同我分析问题一时所讲,这时ctrl+z是被当作字符被解析的,这个时候输出是个箭头!
beersheep 2007-11-18
  • 打赏
  • 举报
回复
多谢两位老大,我终于明白了

再问一个小问题,关于这个EOF,在windows里面是Ctrl+z,当我在一行单独按下Ctrl+z时再按回车时,程序退出,没问题

但是,如果我是在一行输入的结尾按下Ctrl+z再按回车,程序输出前面的字符,但并不结束,我还可以继续输入,只不过这次的输入没有换行,在程序输出的后面立即执行,这又是为什么呢?
beersheep 2007-11-18
  • 打赏
  • 举报
回复
如同您在问题一中所说的,当我输入abCtrl+z时,abCtrl+z被放入缓冲区,getchar()依次读取这三个字符,当读到abCtrl+z时,确实是什么也不输出,让我继续输入的,不是输出箭头,我用下面的程序验证的~

但是当我输入Ctrl+z,就直接退出了,我不懂的是,在abCtrl+z这个序列中,当读到Ctrl+z时,为什么和一开始读到Ctrl+z的输出就不一样了呢?换句话说,是不是Ctrl+z在单独输入是按EOF算,但在一行字符的结尾,就按一个字符算呢?

还有一个补充是,如果我输入abCtrl+zab,那么输出也是ab,在ab后紧跟输入提示_

多谢指教啦!

#include <stdio.h>

int main (int argc, char *argv[]) {

int ch;

while((ch = getchar()) != EOF)
{
putchar(ch);
}

return 0;

}
Treazy 2007-11-18
  • 打赏
  • 举报
回复
那是回车换行,因为当c检测到输入时敲入的空行时,此时你会发现光标(若在第一行)直接到了第三行
原因就是此时c为回车换行符号,所以就看到了这个情况!

这句话改成
那是回车换行,因为当c检测到输入时敲入的回车时,此时你会发现光标(若在第一行)直接到了第三行 原因就是此时c为回车换行符号,所以就看到了这个情况
lj860603 2007-11-18
  • 打赏
  • 举报
回复
getchar和putchar是不是有一种类似queue的储存机制啊
=======================
是的。

程序中的问题是流缓冲的问题。缓冲是一种处理方式,写到一个流的字符不是一执行输出就立刻写到了文件里面,
而是先在一个缓冲区域里面聚集成一块,然后异步地以块为单位传送到文件里面。之所以采用缓冲技术是因为低级
的I/O函数调用起来实际上十分费时间的(嘿嘿,具体机制可以去看看操作系统方面的东西,因为这里一说起来
就是一大片了,这里我偷懒啦)。
如果想一个一个输出,可以调用fflush函数来刷新一下缓冲区。缓冲是个重要的话题,应该去查查看,仔细研究一
下。如果暂时不懂没关系,先跳过去,以后学习到这方面会懂啦。
Treazy 2007-11-18
  • 打赏
  • 举报
回复
int getchar(void) 从标准输入流读取一个字符并回显
先分析下面的程序

while((ch = getchar()) != EOF)
{
putchar(ch);
}

注意了,getchar是读入一个字符,但是当你在提示输入后输入一串字符时,比如"1234",这个时候先输出了
"1",但是程序并没有再提示你输入任何字符,而是继续输出了"234",这是因为getchar在检测stdin中也就是缓冲中已经有上次输入的数据了,它就不再提示输入,而是继续输出了!直到把整个字符串输出完
楼主去体会一下下面代码和上面区别!

while((ch = getchar()) != EOF)
{
ffush(stdin);
putchar(ch);
}


第一个问题我们解释完了
接下来看第二个

while((ch = getchar()) != EOF)
{
printf( "%c", ch);
putchar(ch);
}

由于加了2句输出字符,每个输入的字符自然都会输出2次,这是没有疑问的
关键是最后又多出来一空行,其实那不是空行
那是回车换行,因为当c检测到输入时敲入的空行时,此时你会发现光标(若在第一行)直接到了第三行
原因就是此时c为回车换行符号,所以就看到了这个情况!

69,378

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧