C17 (N2176) 標準規定,如果沒有寫入錯誤,“fputc 函式回傳寫入的字符”(7.21.7.3)。
但在背景關系中
int c ;
// ... later, c is assigned an "interesting" value ...
int k = fputc ( c , stdout ) ;
是
k == c || k == EOF
總是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改寫另一個貨幣符號(或某個任意字符)。
uj5u.com熱心網友回復:
是
k == c || k == EOF總是正確的?
通常是的,但不是。
與fputc ( c , stdout ),c轉換為 anunsigned char并寫入。EOF回傳的就是那個值。
相反,期望k == (unsigned char) c || k == EOF.
該
fputc函式將c(轉換為 anunsigned char)指定的字符寫入輸出流 ...
回傳: 該fputc函式回傳寫入的字符。如果發生寫入錯誤,則設定流的錯誤指示符并fputc回傳EOF。C17dr § 7.21.7.3 2-3
一個稍微不那么罕見例子是,當ch從分配char被簽署并與值小于0的函式回傳值預計是[0...UCHAR_MAX]或EOF。
例子
char ch = -96;
printf("%d %d %d\n", SCHAR_MIN, ch, fputc(ch, stdout));
輸出
?-128 -96 160
也許程式會輸出一個本地貨幣符號。
隨著fputc('\u0024', stdout),同fputc(0x24, stdout)和fputc(36, stdout),被認為是象征什么是特定的實作。C 沒有指定使用 ASCII,即使它無處不在。C 不指定字符渲染的字體或形狀。不過,可能會$。
uj5u.com熱心網友回復:
是的,fputc總是回傳EOF或 寫入的字符。
根據cppreference.com 上的頁面fputc:
回傳值
成功時,回傳寫入的字符。
失敗時,回傳EOF并設定ferror()流中的錯誤指示符(請參閱)。
來自 C17 標準 (7.21.7.3/2-3, N2310 ):
說明
該fputc函式將 c 指定的字符(轉換為 anunsigned char)寫入stream ... 指向的輸出流。回傳
該fputc函式回傳的字符寫入。如果發生寫入錯誤,則設定流的錯誤指示符并fputc回傳EOF。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/327475.html
上一篇:我應該如何在C中制作這個邏輯?
