0
  1. *bufp = buf と書くのはなぜですか。どちらも配列なので、私の意見では次のようにする必要があります。

    static char bufp = buf;
    
  2. *bufp はどの位置から表示を開始するかをどのように「認識」しますか? ゼロに初期化されることはありません。に割り当てbufた後bufp、戻り行では最後に入力された文字から始まると思います。

  3. unsigned char 修飾子は、入力の場合を省略するためにここで使用されていますか?ほとんどのシステム-1で意味がありますか?EOF

#include "syscalls.h"
/* getchar: simple buffered version */
int getchar(void)
{
    static char buf[BUFSIZ];
    static char *bufp = buf; /* [1] */
    static int n = 0;
    if (n == 0) {            /* buffer is empty */
        n = read(0, buf, sizeof buf);
        bufp = buf;          /* ? [1] here it is written like in my question so which is true ? */
    }
    return (--n >= 0) ? (unsigned char) *bufp++ : EOF; /* [2] & [3] */
}
4

2 に答える 2

1

bufは配列なので、char 型ではなく char * 型です。

char *bufpbufp もタイプ であることを宣言しchar *ます。一般に、以下の 2 つのアプローチは似ています。

char *bufp = buf;   // Declare and assign in a single line

char *bufp;   // Declare
bufp = buf;   // Then assign

static修飾子のため、この例では最初のオプションのみが可能です。

bufpは と同じ値を持つポインタですbuf。つまり、bufの最初の要素のアドレスですbuf[BUFSIZ]bufpもこのアドレスを指します。したがってbufp、「buf」が知っていることはすべて「知っています」。bufp[n]範囲外にならない限り、のようなものを使用することもできnます。

要約すると、buf[BUFSIZ] は、アドレスがbuf、 または&buf[0]、またはbufpの配列です&bufp[0]

EOF は必ずしもすべてのシステムで同じであるとは限らないため、最後の行で一貫性が確保されます。

于 2012-08-18T15:28:09.627 に答える
1

[1]char bufp = bufは正しくありません。buf は char の配列 (内部的にはアドレス、つまりポインターの内容) でありchar bufp、一意の文字を宣言するからです。char *bufp代わりに、char へのポインターです (最初の char へのポインターですが、次の char にもアクセスできます)。

[2]は、配列の最初の文字、つまり最初の文字をbufp指します。bufに設定nされてい0ます。bufpbufおよびnすべて静的です。つまり、関数が返された後に「生きている」ことを意味します。プログラムがロードされると、それぞれの値が初期化され、関数が呼び出されるたびに初期化が実行されなくなります。したがって、バッファのステータスを「記憶」します。

`n` is the number of characters in the buffer, ready to be returned one by one,

`bufp` points to the next character to be returned (when n > 0),

and `buf` the array just holds the characters in the buffer.

[2] の質問に答えるには、

  • 使用可能な文字がない場合 (n == 0) を呼び出すと、readバッファがいっぱいになり、その配列の先頭がポイントされます。bufbufp
  • バッファ文字が 1 つずつ返されていない限り (n > 0)、*bufp次の文字が返されます。返される文字を指定し、ポインターを 1 つ*bufp++インクリメントします。bufp

[3]unsigned修飾子は、anが返されるため、コンパイラが*bufp文字 (8 ビット) の符号をint他のバイト (通常は 32 ビット、つまり最上位 24 ビット) に伝播するのを防ぎます。intしたがって、code が 127 を超える文字 (unsigned char の場合、または符号付き char の場合は負) はそのまま返されます (たとえば、(unsigned char)200 は (int)200 として返されます)。

于 2012-08-18T16:06:22.913 に答える