【问题标题】:C printf/read CollissionC printf/读取冲突
【发布时间】:2015-11-18 22:41:57
【问题描述】:

我目前正在尝试让这段代码正常工作:

//TODO THIS IS NOT WORKING
printf("WARNING: THE USER INPUT WILL OVERWRITE THE FILE \"%s\". ARE YOU SURE? [Y/N] ", output_file_name);
int c;

while(read(0, &c, 1) == 1) {
    if (((unsigned char) c) == 'y')
        printf("YES");
}

我期望代码做什么: 我期待得到文本

警告:用户输入将覆盖文件“文件名”。你确定吗? [是/否]

在命令行中打印。为了能够写点东西,在按下 enter 之后,我希望看到文本 YES 打印的次数与前面给出的 'y's 一样多输入。相反,这就是我得到的:

./myprogram.o
I type things.
Including yyyy
ydkfasjf
yay
Now I'm tired and will press ctrl+d to write EOF to stdin...
WARNING: THE USER INPUT WILL OVERWRITE THE FILE "FILENAME". ARE YOU SURE? [Y/N]YESYESYESYESYESYESYESYES
Matthias@BASH ~/folder/

这里发生了什么?我认为 printf 和 read 函数会以某种方式发生冲突...有人可以赐教吗?

【问题讨论】:

  • fflush(stdout); 在第一个 printf() 之后?
  • int c; --> char c
  • 我认为嵌入式 ARM 设备(例如智能手机)比 x86 类 PC 更多。在任何情况下,这都不是破坏代码的理由
  • 我计算的 YES 与输入中的 y 一样多。似乎它正在做它应该做的事情。不确定在此之前的代码是什么,但大部分输入都以读取命令结束,该命令将循环直到到达 EOF。
  • @Test,没有人建议fflush(stdin)。建议使用fflush(stdout)。 (注意细节)见comment

标签: c parsing io


【解决方案1】:

stdout 通常是 line 缓冲的。要强制在下一行代码之前进行输出,请将'\n' 添加到输出中或使用fflush(stdout)

还将int c 更改为char c 以正确将数据读入c

printf("WARNING: THE USER INPUT WILL OVERWRITE THE FILE \"%s\". ARE YOU SURE? [Y/N] ", 
    output_file_name);
fflush(stdout); // *****
// int c;
char c;

while(read(0, &c, 1) == 1) {
    if (((unsigned char) c) == 'y') {
      printf("YES");
      fflush(stdout); // *****
    ]
}

【讨论】:

  • 这解决了在阅读之前没有打印警告的问题,但是在'y'+换行符之后仍然没有打印“是”。
  • @Test,您是否添加了 both fflush(stdout)? (注意细节)
  • 现在它实际上有效,当我写评论并同时尝试它时,你还没有编辑你的答案。谢谢!
  • @Test initial 编辑说“要在下一行代码之前强制输出发生,请在输出中添加 '\n' 或使用 fflush(stdout)。”这适用于printf("WARNING: ....,正如您尝试的那样,也适用于printf("YES");,这是刚刚解决的同一个问题。 patience grasshopper
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
  • 1970-01-01
  • 1970-01-01
  • 2012-04-27
  • 2020-03-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多