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