混淆 regrading ungetc 函数

标签 c input scanf ungetc

我不明白这个程序是如何工作的?

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() pushes c 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/

相关文章:

c++ - C++ 中带有输入函数的 Lambda auto 给出错误

javascript - 表单字段输入数字通过在前面添加零自动转换为3位数字

c - 为什么 scanf 需要 &?

c++ - Scanf_s 在 C++ 中为空

c - 使用strtok在c中分割一个字符串

c - 如何在 C 中使用 graphviz 创建双向箭头?

c - 我如何使用数组和 MACRO 创建一个调查,告诉 C 中的评级和响应数量?

java - Java中如何检查值的类型?

c - scanf() 只有符号和数字

c - 如何向不可变内存块声明常量 "mutable pointer"