- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我不明白这个程序是如何工作的?
char c;
int i;
for(i=1;i<=5;i++)
{
scanf("%c",&c);
printf("%c",c);
ungetc(c,stdin);
}
程序的输出是- 第一次输入的字符被打印了5次。
a
aaaaa
根据 SO 帖子 What is the difference between putc and ungetc? ungetc
将某些内容放回输入缓冲区。
所以在这个程序中,在第一次迭代期间,scanf()
接受来自键盘的输入,然后 printf()
显示它,然后 ungetc()
将相同的字符推回输入缓冲区。
但是在第二次迭代期间没有输入被接受,所以我猜测 printf()
打印被 ungetc()
插入输入缓冲区的字符。
谁能清楚地解释一下这个程序究竟是如何工作的?
最佳答案
根据 man page ungetc()
ungetc()
pushesc
back to stream, cast to unsigned char, where it is available for subsequent read operations.
所以,基本上,无论您第一次输入什么 char
,它都会被读取到 c
变量中,并且在打印之后,相同的值会被推送到输入缓冲区。现在,scanf()
从输入缓冲区读取,因此 ungetc()
推送的值可供下一个 scanf()
读取它。这就是为什么 scanf()
不会请求用户输入。
现在,随着循环运行 5 次,您将遇到 5 个 scanf()
,它们都读取第一个输入数据,并打印相同的数据 5 次。
就是说,始终检查 scanf()
的返回值以确保它成功。
关于混淆 regrading ungetc 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31340897/
我不明白这个程序是如何工作的? char c; int i; for(i=1;i<=5;i++) { scanf("%c",&c); printf("%c",c); un
我不明白这个程序是如何工作的? char c; int i; for(i=1;i<=5;i++) { scanf("%c",&c); printf("%c",c); un
这个问题在这里已经有了答案: What is the precedence of the + (plus) operator in Java? (4 个答案) 关闭 9 年前。 为什么我得到 10
我在网站导航栏中遇到有关下拉菜单的问题。我正在使用 bootstrap v 3.3.6 将鼠标悬停在菜单名称(这里是功能)上,我希望它看起来应该像旁边的按钮(请求演示按钮)。右侧边缘在悬停时变得更锐利
我正在关注程序 typedef std::map FileNameToStorageClass; FileNameToStorageClass m_mapFileNameToLogStorage;
我是一名优秀的程序员,十分优秀!