有什么办法可以查看标准输入缓冲区吗?

2024-03-31

我们知道stdin默认情况下是缓冲输入;证明这一点的证据是使用任何“留下数据”的机制stdin, 例如scanf():

int main()
{
    char c[10] = {'\0'};
    scanf("%9s", c);
    printf("%s, and left is: %d\n", c, getchar());
    return 0;
}

./a.输出
你好
你好,左边是 10

10当然是换行符...

我一直很好奇,有没有什么办法可以“偷看”stdin缓冲而不删除任何可能存在的东西?

EDIT
更好的例子可能是:

scanf("%9[^.]", c);

输入“at.ct”后,现在我有了“数据”(ct\n) 仍然开着stdin,不仅仅是换行符。


可移植的是,您可以使用以下命令获取输入流中的下一个字符getchar()然后将其推回ungetc(),这会导致一种状态,就好像该字符没有从流中删除一样。

The ungetc函数压入指定的字符c(转换为unsigned char)返回到由流指向的输入流。推回的字符将通过该流上的后续读取以推回的相反顺序返回。

标准仅保证一个推回字符,但通常,您可以推回更多字符。

正如其他答案中提到的。实际上,如果您提供自己的缓冲区,您几乎肯定可以查看缓冲区setvbuf,尽管这并非没有问题:

If buf不是空指针,它指向的数组可以用来代替由setvbuf功能

这使得所提供的缓冲区可能根本无法使用。

任何时候数组的内容都是不确定的。

这意味着您无法保证缓冲区的内容反映实际输入(如果我们挑剔的话,如果缓冲区具有自动存储持续时间,则使用缓冲区会产生未定义的行为)。

然而,实际上,主要问题是找出缓冲区中缓冲输入的尚未消耗部分的开始位置和结束位置。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有什么办法可以查看标准输入缓冲区吗? 的相关文章

随机推荐

  • LiveData 在第一次回调后删除观察者

    收到第一个结果后如何删除观察者 下面是我尝试过的两种代码方式 但即使我删除了观察者 它们仍然会不断接收更新 Observer observer new Observer
  • 用于从 LOB 数据类型的 Oracle 数据库检索大字符串的 Java 类

    拥有一个 Oracle 数据库 其字段之一设置为 LOB 大对象 数据类型 当我运行 select 语句时 会抛出此错误 ERROR ORA 22835 Buffer too small for CLOB to CHAR or BLOB t
  • 从芯片组中获取选定的芯片[重复]

    这个问题在这里已经有答案了 我是在 Android 中使用 Chips 的新手 我想在单击按钮时从 ChipGroup 中获取选定的 Chip Made 是以某种方式检查每个 Chip 并将其添加到 Set 中 但希望使其更加高效 不知何故
  • python/genshi 换行符到 html

    段落

    我试图用 genshi 输出评论的内容 但我不知道如何将换行符转换为 HTML 段落 这是一个测试用例 它应该是什么样子 input foo n n n n nbar nbaz output p foo p p bar p p baz p
  • 在Linux中使用循环更改目录

    我想更改目录以在每个目录中执行任务 以下是代码 for i in 1 10 do cd dir subdir i bla bla bla done 但是我收到错误 not found No such file or directory 我已
  • 如何处理和包含标头和库以在不同计算机上构建 Visual Studio 2010 解决方案

    我有一个 Visual Studio 2010 解决方案 需要包含 4 个不同的第三方库和标头 这些第三方依赖项在包含之前会单独安装 所以头文件和库的包含路径在不同的机器上是不同的 现在 我想要的是让不同的开发人员在不同的机器上构建我的解决
  • 处理非重叠范围的建议方法(例如调度)

    我已经见过几次此类问题 并且正在尝试确定以非重叠方式存储范围的最佳方式 例如 当调度某种一次只有一个人可以使用的资源时 我所看到的大多是这样的 PERSON ROOM START TIME END TIME Col Mustard Libr
  • JSP中如何获取HTTP post参数

    I am new to JSP I have a jsp page where a parameter is passed to this jsp page with http post I can see the parameter in
  • 操作无法完成。 (com.facebook.sdk 错误 2。)ios6

    您好 我正在使用 ios 6 进行 facebook 登录 并且我收到此错误作为本机弹出窗口 操作无法完成 com facebook sdk 错误 2 这是我使用的场景 我在模拟器上运行这个 我已通过设置登录 Facebook 应用程序 并
  • .NET 4 中的延迟初始化

    什么是延迟初始化 这是我在谷歌搜索后得到的代码 class MessageClass public string Message get set public MessageClass string message this Message
  • 将 maven-release-plugin 与 git-1.8.5 一起使用

    当使用 git 1 8 5 maven release plugin 使用版本 2 4 2 和 2 3 2 测试 和 mvn 使用版本 3 1 1 和 3 0 5 测试 时 运行mvn release prepare and mvn rel
  • R xts 对象将 xts 对象子集为特定小时内多天的日内数据

    xts 对象中有没有办法执行与下面相同的操作 但对于具有多天日内数据的 xts 对象 下面的工作原理就像一个时钟 但只显示一天的数据 如果我从 22 号到 26 号通过 xts 它就不会 似乎无法一次性完成多天 xts 中的日内数据子集化
  • 在 Spark 中堆叠 ML 算法

    是否有 Spark api 可以在 Spark 中构建堆叠集成 或者应该从头开始构建它们 我在网上没有找到有关此主题的任何资源 正如 AKSW 的评论中所说 在当前的 Apache Spark MLlib 中 Ensemble Models
  • 在打字稿中使用react-redux连接

    我尝试使用 redux 和 react router dom 在 typescript 中构建一个 React 应用程序 当我将 redux 添加到我的应用程序时 我遇到了打字问题 因此 我创建了以下只有一页的最小示例测试页 App jsx
  • 关于比奈公式的一些知识

    为什么比奈公式 O LogN 但不完全是 在时间上比迭代方法 O n 效果更差 static double SQRT5 Math Sqrt 5 static double PHI SQRT5 1 2 public static int Bi
  • 使用nl2br将textarea新行保留到mysql...如何很好地将数据返回到文本框?

    我有一个带有文本区域的表单 其结果被插入到 mysql 数据库中 我使用 nl2br 来保留换行符 但是 因为这会在文本中插入 br 所以当用户去编辑他们在文本区域中输入的内容时 它会显示文本区域中保存在 mysql 中的所有 br 对于不
  • 编写 MVVM 样板代码的更好方法?

    我发现自己最近编写了很多样板 MVVM 代码 并且想知道是否有一种奇特的方法可以绕过编写所有这些代码 我已经使用了ViewModelBase实现的类INotifyPropertyChanged但这并不能解决必须编写所有访问器代码等的问题 也
  • python 中的大 O 表示法

    有谁知道有什么学习大符号的好资源吗 特别是学习如何遍历一些代码并能够看到它会是 O N 2 或 O logN 最好能告诉我为什么这样的代码等于 O N log N def complex numbers N len numbers resu
  • jQuery:在 3 个类之间切换(最初)

    我在这里看过几篇关于 SO 的帖子 但它们在功能和结构上过于具体 而我正在寻找的是更通用的东西 我或任何人都可以在任何地方使用 我所需要的只是有一个按钮 单击该按钮可以在之间循环3类 但如果出现必须循环 4 个 5 个或更多类的情况 则可以
  • 有什么办法可以查看标准输入缓冲区吗?

    我们知道stdin默认情况下是缓冲输入 证明这一点的证据是使用任何 留下数据 的机制stdin 例如scanf int main char c 10 0 scanf 9s c printf s and left is d n c getch