[英]Does the C standard specify behavior for reading input from stdout?
以下程序:
#include <stdio.h>
int main()
{
char s[10] = "";
fprintf(stdout, "%s", "hello");
fscanf(stdout, "%6s", s);
perror(NULL);
}
输出Bad file descriptor
。 但是C11草案标准的 7.21节似乎并没有说明是否允许将stdout
传递给fscanf
。 这是未定义的行为吗? 显式(给出标准报价)还是隐式(省略)?
规范(ISO / IEC 9899:2011(E),§7.21)实际上并未提及对输入流传递给输出函数或输出流传递给输入函数的任何限制。 规范中的唯一限制是传递给fflush
的流必须是输出流。
§4/ 2(引用WG14 N1570):
未定义的行为在本国际标准中通过“未定义的行为”或未明确定义行为来表示。
§7.21.3/ 11
字节输入函数从流中读取字符,就像通过连续调用
fgetc
函数一样。
(而fscanf
是字节输入函数;第7.2.1 / 5节)。
§7.21.7.1:
fgetc
函数概要
#include <stdio.h> int fgetc(FILE *stream);
描述
2如果对于输入流的结束文件指针指向的
stream
没有设置和下一个字符存在,则fgetc
函数获取字符作为unsigned char
转换为int
和推进相关联的文件中的位置指示器的流(如果已定义)。返回
3如果设置了流的文件结束指示符,或者流在文件末尾,则设置了流的文件结束指示符,并且
fgetc
函数返回EOF
。 否则,fgetc
函数返回从输入流中的下一个字符被指向stream
。 如果发生读取错误,将设置流的错误指示符,并且fgetc函数将返回EOF
。 [脚注省略]
fgetc
的规范反复说“流指向的输入stream
”; 在我看来,这可以通过两种方式来读取:要么存在一个隐式要求,即stream
指向输入流,要么标准省略了当stream
不指向输入流时指定任何行为。
在第一种情况下,将非输入流传递给fgetc
违反了该要求,并且是未定义的行为(另请参见第7.1.4 / 1节;有人可能会认为这算作“函数范围之外的值”); 在第二种情况下,通过遗漏将非输入流传fgetc
是未定义的行为,因为在这种情况下标准没有说明fgetc
的行为。 因此,我认为fgetc(not_an_input_stream)
会导致未定义的行为。
如果fgetc(not_an_input_stream)
是未定义的行为,则fscanf(not_an_input_stream, /*...*/)
fgetc(not_an_input_stream)
也是如此,因为后者被指定为读取字符,就像通过调用前者一样。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.