【问题标题】:EOF from standard input is displayed in standard output标准输入的 EOF 显示在标准输出中
【发布时间】:2015-12-20 15:18:19
【问题描述】:

我正在做一些从标准输入读取并在标准输出中写入的测试,有些事情真的让我很困扰。

当我尝试写一个单个字符后跟一个 \n 时,EOF 中的“D”(我认为)在字符之后打印。

这是终端中发生的事情:

 >./myprog
 sometext I enter
 "Ctrl + D"
 jD
 j
 >

这里是代码:

#define BUF_SIZE 4096

void    read_std_in()
{
    int     ret;
    char    buf[BUF_SIZE + 1];

    while ((ret = read(0, buf, BUF_SIZE)))
    {
        buf[ret] = '\0';
        // Concatenating buffer with some other string, not important here.
    }
    write(1, "j", 1);
    write(1, "\n", 1);
    write(1, "j", 1);
    write(1, "\n", 1);
}

如您所见,第一个“j”不知从何得到一个“D”。

如果我尝试为 forst 行显示超过 1 个字符,则不会出现问题:

 >./myprog
 sometext I enter
 "Ctrl + D"
 jj
 j
 >

如果我没有输入字符(只是 \n),我会得到:

 >./myprog
 sometext I enter
 "Ctrl + D"
 ^D
 j
 >

如何避免这种行为?

【问题讨论】:

  • 请问BUF_SIZE 是什么?
  • @alk 我使用 4096。我将编辑我的帖子。
  • 您使用的是哪种 UNIX/C 实现?
  • 我正在使用 OS X/??。如何知道 C-Implementation?
  • C 实现是指编译器和使用的 libc。

标签: c macos unix


【解决方案1】:

我在 OS X/Darwin 中得到了相同的行为。

当您按下 CtrlD 时,^D 似乎正在回显到控制台,但没有推进文本光标。结果,第一个j 被放置在^ 字符的顶部。 (您可以通过将第一个 write(1, "j", 1); 更改为 write(1, "\33[2Cj", 5); 来验证这一点,这会在打印 j 之前将光标向右移动两个位置。)

我认为没有任何简单的方法可以阻止^D 出现,所以你可以忽略它。 D 不会添加到您的输入中,因此不会对您的软件操作造成任何问题。

或者,如果您将输入通过管道传输到您的程序,那么问题就会消失:

./myprog <<<"some text"

【讨论】:

    猜你喜欢
    • 2013-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    • 2012-06-08
    相关资源
    最近更新 更多