不是说ungetc(ch, stdin)中ch如果没有读出来不是放不进去新的字符吗?
下面是个练习ungetc()小程序:
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
int main(void)
{
char ch, ch1, ch2;
scanf("%c", &ch);
ch1 = getchar();
ungetc(ch, stdin);
ungetc(ch1, stdin);
ch2 = getchar();
printf("%c\n", ch2);
return 0;
}
比如我在黑窗口中输入whale,我想应该是ch = w;ch1 =h;了,再把ch放回缓冲区中,又把ch1放回缓冲区中,因为ch放回去后没有及时读取,应该ch1是放不回去的,那么应该ch2 = w才是,因为ch2要到缓冲区读取数据,那这个数据应该是w.但是结果是ch2 = h;为什么?
[解决办法]
int
main (int argc, char **argv)
{
ungetc ('\n', stdin);
ungetc ('c', stdin);
ungetc ('b', stdin);
ungetc ('a', stdin);
printf ("%c", getc(stdin));
printf ("%c", getc(stdin));
printf ("%c", getc(stdin));
printf ("%c", getc(stdin));
return 0;
}
把这程序看懂了, 你就明白了
[解决办法]
ungetc(ch1, stdin);
ch2 = getchar();
所以实际上ch2=ch1,为字符h
[解决办法]
你有没有运行我的程序? "后面三个是放不回去的"这怎么可能, stdin是标准输入流,他是有缓冲区的。ungec的行为类似于栈, 先进后出,所以ungec 依次压入\ncba, 输出时顺序也就成了abc\n
[解决办法]
最后ungetc的值最先读出来。
[解决办法]
A character is virtually put back into an input stream, decreasing its internal file position as if a previous getc operation was undone.
[解决办法]
在 MSDN 上面有这么一段话:
Results are unpredictable if ungetc is called twice without a read or file-positioning operation between the two calls
而且 你可以 测试 ugetc 的返回值, 其实 连续的第二次 调用 ugetc 返回 EOF 了 表示失败了!!!
[解决办法]
一句话,这个缓冲区是一个栈而非一个队列。get类似于pop,unget类似于push,能明白吗