stdin是否包含回车符(\ r)char?

时间:2014-09-15 08:28:23

标签: c terminal cross-platform stdio

SO answer我写了这段代码:

char fail_on_eof (int c)
{
    if (c == EOF)
        exit (EXIT_FAILURE);
    return (char) c;
}

void skip_to_next_line (void)
{
    char c;
    do
    {
        c = fail_on_eof (getchar ());
    } while (c != '\n');
}

我想知道是否有任何终端可能会返回'\r'(只要在行尾有'\n',就会被上述代码覆盖。)

stdin是否包含'\r'(在任何平台上)?那么输入重定向stdin总是在文本模式下工作?

1 个答案:

答案 0 :(得分:4)

当然,这很容易。您可以从包含该字符的文件中读取,或者您可以执行类似操作(在Linux和类似操作系统下):

printf "\r" | yourProgram

甚至来自允许转义的终端程序,例如 CTRL-V CTRL-M

然而,在C世界中,它不被视为行尾,它订阅了LF方法来指示行尾。来自C11 7.21.2 Streams /2

  

文本流是按行排列的有序字符序列,每行   由零个或多个字符加上一个终止的换行符组成。

     

可能必须在输入和输出上添加,更改或删除字符,以符合在主机环境中表示文本的不同约定。

换句话说,尽管某些系统在底层环境中使用不同的 line ending character,但其中许多系统在C环境中进行自动转换,以确保代码按预期运行。