3

fgetsは印刷できない文字を指定されたchar*に読み込むことができますか(できないようです)?そうでない場合は、ストリームからchar*への入力文字の最大数を許可する代替手段は何ですか?

編集(私の特定の場合)

「Le\D7」をstdoutに出力するエンコーダーがあります。これは、以下を使用してstdinからそれを取得するデコーダーにパイプされます。

if( fgets( inputChars, MAX_BYTES_IN, stdin ) == NULL )
{
    fprintf( stderr, "Trouble getting input\n" );
    return 0;
}

while( inputChars[crntChar] != '\0' && inputChars[crntChar] != '\n' )
{
    printf( "Value %d: %d\n", crntChar, inputChars[crntChar]);
    crntChar++;
}

これにより、次のようになります。

Value 0: 76
Value 1: 101
Value 2: -41

fgetcを使用しても同じ結果になります

4

3 に答える 3

1

最も簡単な方法は、を使用することfgetc()です。fgets()内部的にはに依存していfgetc()ます。

しかし、選択肢はたくさんありfread()、そのうちの1つです。fscanf()

fgetc()その他は、印刷可能な文字と印刷不可能な文字の両方をchar配列に読み込みます。Acharは、ASCIIでエンコードされた1バイトの数値(またはの場合は2バイトwchar_t)です。Cには概念printableと文字はありません。non printable

于 2013-02-08T03:22:02.577 に答える
1

符号なし整数から符号付き整数への変換が原因で、奇妙な値が得られます。

char x = 198;

printf("x = %d\n", x);
printf("(unsigned) x = %u\n", (unsigned) x);
printf("(unsigned char) x = %d\n", (unsigned char) x);

出力:

x = -58
(符号なし)x = 4294967238
(unsigned char)x = 198

キャストはあなた(unsigned char)が望むものです。

私のコードの署名されたオーバーフローは無視してください。GCCと-funsigned-charフラグを使用してコンパイルする場合、出力は次のようになることに注意してください。

x = 198
(符号なし)x = 198
(unsigned char)x = 198
于 2013-02-08T03:37:18.353 に答える
0

fgets()文字列の1行を読み取ります。この場合は、改行\n/0x0AまたはNULL/まで読み取りますEOF

または、印刷できないASCIIにunsignedchar*を使用することもできます。

だから私の意見では、はいfgets()は印刷できないASCIIを読むことができます

于 2013-02-08T03:31:49.070 に答える