#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)
答案 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
会被流的内部工作自动替换为\n
。 scanf
永远不会有机会看到\r
。
如果您从以文本模式打开的文件中读取数据,那么该平台也会发生同样的事情。即使该文件在每个字符串的末尾包含0xD 0xA
(\r\n
),fscanf
也只会看到\n
而不是\r
。
在本地使用此组合作为行结束标记的平台上查看\r\n
的唯一方法是使用二进制流。同时,stdin
作为文本流打开。
P.S。当您将数据写入文本流时,会发生相反的情况。您编写\n
,但流会自动将其替换为\r\n
。