在 C 中,“fputc”什么时候可以返回除第一个参数之外的其他内容?

Ana*_*bus 3 c stdio return-value output

C17 (N2176) 标准规定,如果没有写入错误,“fputc 函数将返回写入的字符”(7.21.7.3)。

但在这样的背景下

int c ;
// ... later, c is assigned an "interesting" value ...
int k = fputc ( c , stdout ) ;
Run Code Online (Sandbox Code Playgroud)

k == c || k == EOF
Run Code Online (Sandbox Code Playgroud)

总是true?即,假设fputc不返回EOF,是否保证返回c?第三种方式,可以fputc写一个不同于第一个参数的字符吗?

例如,如果我请求输出美元符号(不保证在源或执行字符集中,AFAICT),可以'\u0024' != fputc('\u0024', stdout)。也许程序会输出本地货币符号。

澄清

问题是

在 C 中,什么时候可以fputc返回除第一个参数之外的其他参数?

到目前为止(2021-10-20)的部分答案似乎是:

  • 当发生写入错误时fputc
  • 什么时候(unsigned char) c != c

我仍然想知道

假设(unsigned char) c == c, 但(unsigned char) c与执行字符集中的某个字符不匹配。可以fputc写其他字符吗?

例如,假设c == (unsigned char) '\u0024'执行字符集中不存在 (ASCII 美元符号)(因为执行字符集是非 ASCII)。fputc例如,可以写另一个货币符号(或某个任意字符)。

chu*_*ica 5

\n

k == c || k == EOF正确的吗?

\n
\n

通常是的,但不是。

\n

fputc ( c , stdout ),c转换为 anunsigned char并写入。正是这个值或EOF返回的值。

\n

相反,期待k == (unsigned char) c || k == EOF.

\n
\n

该函数将由(转换为)fputc指定的字符写入输出流... \n返回:该函数返回写入的字符。如果发生写入错误,则设置流的错误指示符并返回。C17dr \xc2\xa7 7.21.7.3 2-3cunsigned char
fputcfputcEOF

\n
\n
\n

一个不太罕见的例子是,当ch带符号char且值小于 0 的 a 赋值时。函数返回值预计为或[0...UCHAR_MAX]EOF

\n

例子

\n
char ch = -96;\nprintf("%d %d %d\\n", SCHAR_MIN, ch, fputc(ch, stdout));\n
Run Code Online (Sandbox Code Playgroud)\n

输出

\n
\xef\xbf\xbd-128 -96 160\n
Run Code Online (Sandbox Code Playgroud)\n
\n
\n

也许程序会输出本地货币符号。

\n
\n

对于,与和fputc('\\u0024', stdout)相同,所看到的符号是特定于实现的。C 没有指定使用 ASCII,即使它无处不在。C 没有指定字符渲染的字体或形状。不过,很可能会是。fputc(0x24, stdout)fputc(36, stdout)$

\n