我正在做一些测试,从标准输入读取和在标准输出中写入,有些事情真的困扰我。
当我尝试写一个单个字符后跟一个\ 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行显示多个字符,则不会出现问题:
>./myprog
sometext I enter
"Ctrl + D"
jj
j
>
如果我没有放任何字符(只是\ n)我得到:
>./myprog
sometext I enter
"Ctrl + D"
^D
j
>
如何避免此行为?
答案 0 :(得分:5)
我在OS X / Darwin中遇到了相同的行为。
当您点击 Ctrl D 但是没有推进文本光标时,看起来^D
正在回显到控制台。因此,第一个j
被放置在^
字符的顶部。 (您可以通过将第一个write(1, "j", 1);
更改为write(1, "\33[2Cj", 5);
来验证这一点,这会在打印j
之前将光标向右移动两个位置。)
我认为没有任何简单的方法可以阻止^D
出现,所以你可以忽略它。 D
未添加到您的输入中,因此不会导致软件操作出现任何问题。
或者,如果您将输入传递给程序,那么问题就会消失:
./myprog <<<"some text"