3

私はCを学んでいますが、以下のコードの動作を理解していません。

#include <sys/types.h>
#include <sys/uio.h>
#include <unistd.h>
#include <stdio.h>

int main() {    
    int buffer;
    read(0, &buffer, sizeof(int));
    printf("%d", buffer);
    return 0;
}

入力:

1

出力:

2609

何が起きてる?出力は1にすべきではありませんか?

4

4 に答える 4

6

1あなたは、10進数と1の数字を混同しています。また、ナンバーワンとコンピューターのナンバーワンの内部表現を混同しています。

1キーボードのキーを押す人は、コンピューターの内部表現を入力していません。したがって、そのキーを整数変数に直接読み取ると、ガベージが発生します。

コンピューターは、2609を0x31、0x0A(リトルエンディアンを想定)として内部に格納します。人が叩い1てから入ると、キーボードは0x31(のASCIIコード1)を送信し、次にEnter(0x0A)を送信します。

しかし、これはガベージイン、ガベージアウトの場合です。整数へのポインタを期待しない関数に整数のアドレスを渡さないでください。

于 2012-05-31T18:31:14.537 に答える
2

あなたは標準入力から読んでいると思います...

scanf 関数を使用する

int scanf(const char *format, ...);

あなたのコードで:

int main() {    
    int buffer;
    scanf("%d", &buffer);
    printf("%d", buffer);
    return 0;
}

URL を参照してください: http://en.wikipedia.org/wiki/Scanf_format_string

于 2012-05-31T19:29:23.783 に答える
1

バイナリとASCIIを読む必要があります。ASCIIをコンソールに入力すると、それを再びasciiに変換します。

また、文字は(通常)1バイトのみです。あなたは4で読んでいます(それがintのサイズであると仮定します)。あなたはあなたの前にたくさんの研究と読書をしています。

于 2012-05-31T18:31:23.543 に答える
1

ストリームからa を読み取り、characterそれを として出力しようとしていますinteger

使用する:

printf("%c", buffer);
于 2012-05-31T18:34:40.620 に答える