4

これをテストscanf("%c" , &addr);する前に、常に等しいと思います:getchar()

#include<stdio.h>

int main()
{
    int i;
    scanf("%c",&i);
    printf("%d\n", i);
    if(i == EOF)
        printf("EOF int type and char input\n");
    i =getchar();
    printf("%d\n", i);
    if(i == EOF)
        printf("EOF int type and char input\n");
}

「Ctrl+D」を 2 回使用すると出力が得られました。

-1217114112

-1

EOF int 型と char 入力

EOF は-1typeintであるため、 scanf("%d",&i);replaceも使用してみますscanf("%c",&i)が、同じ出力が得られます。

混乱しました。誰かが私のためにこれを説明できますか?

- - - - - - - - - - - - - - - - - 編集 - - - - - - - - --------------------------------

の動作を知りたいscanf("%c",i)Ctrl+D 、テストします:

#include<stdio.h>

int main()
{
    int i;
    int j;
    j = scanf("%c",&i);
    printf("%c\n", i);
    printf("%d\n", j);
    if(i == EOF)
        printf("EOF int type and char input");
     i =getchar();
    printf("%d\n", i);
    if(i == EOF)
        printf("EOF int type and char input");
}

出力:

k                  // If the scanf set 1 byte in i , why here print 'k' ?
-1
-1
EOF int type and char input
4

2 に答える 2

3

i未定義の動作 (UB) が含まれるため、比較は完全には設定されません。

int i;            // the value of i could be anything
scanf("%c",&i);   // At most, only 1 byte of i is set, the remaining bytes are still unknown.
printf("%d\n", i);// Your are printing 'i' whose value is not fully determined.

試してみましたか

char ch;
int y = scanf("%c",&ch);
printf("%d\n", ch);
if(ch == EOF)

入力が EOF でなくても、一致する可能性があります。値 255 でスキャンしたchar場合、char は 2 の補数 8 ビット値 -1 になります。int比較では、サイズに一致するように 8 ビットの -1 が符号拡張され、-1 に一致します。
(前提: 2 の補数整数、8 ビット バイト、EOF == -1、char は符号付き)。

正しいEOFテストは

int y = scanf("%c",&ch);
if (y == EOF)

注: getchar()& scanf()returnEOFは、ファイルの終わりまたはI/O エラーを意味します。後続のチェックでこれをferror(stdin)区別します。

于 2013-08-28T14:46:57.827 に答える
3

最初の値はおそらく未定義の動作です。i1 を返さない限り、値を持つことに依存することはできませんscanf()

特に、スキャンされた値 (最初の引数の書式指定子による文字の変換) と関数呼び出しの戻り値をscanf()混同しているようです。

もちろん、戻り値しかないため、このgetchar()区別はありません。

于 2013-08-28T14:44:35.790 に答える