0

私はついにK&Rを終了しましたが、さらに別の不明確なコードに遭遇しました。6.3/6.4章

  1. getwordを参照しています。どうすればintを返すことができ、それは単語であると思われます。最初の文字であるword[0]を返すことを理解しています。しかし、私の意見では、単語を返したい場合は、char*getwordのようなものを紹介します。私は正しいですか?
    それが単語であることをどのように示すことができますか?

  2. まだgetwordについて:「in」と入力し、スペースの後にEnterキーを押したとします。getwordはスペースではないので'i'を読み取り、isalphaなので、最初のifは省略されます。それではどうなりますか?

  3. binsearchで行をマークしました。あなたはそれが高くあるべきだと思いませんか=中程度-1; そこの?

int getword(char *word, int lim) {
    char *w = word;
    int c;

    while (isspace(c = getch()))
    {}
    if (c != EOF) {
        *w++ = c;
    }

    if (!isalpha(c)) {
        *w = '\0';
        return c;
    }
    for ( ; --lim > 0; w++) {
        if (!isalnum(*w = getch())) {
            ungetch(*w);
            break;
        }
    }
    *w = '\0';
    return word[0];
}

/* binsearch: find word in tab[0]...tab[n-1] */
struct key *binsearch(char *word, struck key *tab, int n)
{
    int cond;
    struct key *low = &tab[0];
    struct key *high = &tab[n];
    struct key *mid;
    while (low < high) {
        mid = low + (high-low) / 2;
        if ((cond = strcmp(word, mid->word)) < 0)
            high = mid; /* [3] */
        else if (cond > 0)
            low = mid + 1;
        else
            return mid;
    }
    return NULL;
}
4

2 に答える 2

2

あなたは正しいです、関数が単語を返すなら、それはむしろchar *getword()です。ただし、K&Rによると

関数値は、単語の最初の文字、ファイルの終わりのEOF、またはアルファベットでない場合は文字自体です。

intCの場合と同様に、anを返すことは問題ありません。文字はint、[-128、+127]の範囲で8ビットしかないようなものです。

では、単語はどこに返されますか?
与えられたchar *wordパラメータとして。最初char *wにポインタのコピーを取得し、word次に読み取られた文字が。が指すメモリに設定されwます。

"in "入力バッファにあるとisspace、falseが返さcれ、スペース以外の文字が割り当てられます。次に、その文字を単語( i*w++ )の位置[0]に置くと、ポインター( )がインクリメントされます。'i'が含まれています。w++word[0]

!isalphaテストはfalseであるため、その部分はスキップされます。

次に、文字が入力から読み取られ、w英数字以外のエントリが読み取られるまで(または制限limに達するまで)、次の位置に格納されます。この場合、読み取られた文字は実際に入力バッファに戻されますw。不要なcharが含まれています-(のためにbreak)インクリメントされません。次に、以下*w = '\0'はその非アルファ文字を上書きし、C文字列を「閉じます」(C文字列では0の値を持つ文字で終わります)。

あなたの例では、それは'n'をに格納しw、インクリメントwし、次に''を格納しw、のコードを実行し!isalnumます。つまり、ループを中断します。次に、w''を格納した後にインクリメントされなかったため*w = '\0'、スペースを置き換え、文字列を「閉じます」。

[質問の残りの半分はすでに他の誰かによって回答されています]

于 2012-08-21T16:17:06.113 に答える
2

high = mid正しい。右の境界は含まれていません。最初は、high = &tab[n]つまり、の最後の要素を超えていることに注意してくださいtab

于 2012-08-21T15:57:47.510 に答える