为什么scanf跳过'\ r'但读''n?'

时间:2014-01-11 02:19:11

标签: c scanf

#include <stdio.h>

int main()
{
    int x,y;
    char z;

    scanf( "%d", &x );
    scanf( "%d", &y );
    scanf( "%c", &z );
    printf( "%d %d %d", x, y, z );
}

输入:

1
2
3

输出:

1 2 10

为什么scanf读取\n,而不是\r?按“输入”输入为\r\n

\r - &gt; (ASCII 13)和\n - &gt; (ASCII 10)

2 个答案:

答案 0 :(得分:2)

stdin被定义为文本流(C99 7.19.3.7),根据定义,它仅以换行符终止(C99 7.19.2.2)。这是对stdout的补充,printf仅对换行使用'\ n'(不是'\ r')。

假设您的标准输入由于某种原因是非标准的,大多数平台默认只会将换行符(按Enter键)解释为'\ n'字符。这通常由内核处理,如果你真的需要它,你必须告诉它给你回车。

此外,即使您的平台确实提供了'\ r'字符,'\ n'也可能会在'\ r'之前显示给stdin。尝试:

int x,y;
char z1, z2;

scanf("%d", &x);
scanf("%d", &y);
scanf("%c", &z1);
scanf("%c", &z2);

printf("%d %d %d %d\n", x, y, z1, z2);

答案 1 :(得分:1)

scanf从标准输入stdin读取数据。 stdin text 流。文本流自动将特定于平台的行结尾转换为\n。这意味着\r\n会被流的内部工作自动替换为\nscanf永远不会有机会看到\r

如果您从以文本模式打开的文件中读取数据,那么该平台也会发生同样的事情。即使该文件在每个字符串的末尾包含0xD 0xA\r\n),fscanf也只会看到\n而不是\r

在本地使用此组合作为行结束标记的平台上查看\r\n的唯一方法是使用二进制流。同时,stdin作为文本流打开。

P.S。当您数据写入文本流时,会发生相反的情况。您编写\n,但流会自动将其替换为\r\n