もっと簡単にできるはずなので、おそらく私はこれを考えすぎているのでしょう。fgetc() によって返されるような int 型の値を取得し、それがファイル終了コードでない場合は char バッファーに記録したいと考えています。例えば:
char buf;
int c = fgetc(stdin);
if (c < 0) {
/* handle end-of-file */
} else {
buf = (char) c; /* not quite right */
}
ただし、プラットフォームがデフォルトの char に署名している場合、fgetc() によって返される値は char の範囲外である可能性があります。その場合、(signed) char にキャストまたは代入すると、実装定義の動作が生成されます (そうですか?)。ただし、確かに、この例とまったく同じことを行うコードがたくさんあります。それはすべて実装定義の動作に依存しているか、および/または7ビットデータを想定していますか?
私のコードの動作がCによって定義されていることを確認したい場合は、次のようにする必要があります。
buf = (char) ((c > CHAR_MAX) ? (c - (UCHAR_MAX + 1)) : c);
デフォルトの文字が符号付きか符号なしかに関係なく、文字のサイズに関係なく、定義された正しい動作が生成されると思います。そうですか?そして、移植性を確保するためにそれを行う必要は本当にありますか?