2

私はプログラミングの初心者です。そして私はK&Rの本であるCプログラミング言語を学んでいます。私が読んでいる間、私はこの質問にますます興味を持ちます-入力から文字を1つずつ取得するループがあり、出力関数をループに入れると、その結果は各文字を印刷するようなものになると思いました入力直後。ただし、結果として、キーをタップした後にのみ、コンピューターは文字のパッケージ全体を印刷するように見えます。

K&Rの本からの演習1-22の答えなど:

/* K&R Exercise 1-22 p.34 
 *
 * Write a program to "fold" long input lines into two or more
 * shorter lines after the last non-blank character that occurs before the n-th
 * column of input.  Make sure your program does something intelligent with very
 * long lines, and if there are no blanks or tabs before the specified column.
 */

#include <stdio.h>

#define LINE_LENGTH 80
#define TAB '\t'
#define SPACE ' '
#define NEWLINE '\n'

void entab(int);

int main()
{
    int i, j, c;
    int n = -1;     /* The last column with a space. */
    char buff[LINE_LENGTH + 1];

    for ( i=0; (c = getchar()) != EOF; ++i )
    {
        /* Save the SPACE to the buffer. */
        if ( c == SPACE )
        {
            buff[i] = c;
        }
        /* Save the character to the buffer and note its position. */ 
        else
        {
            n = i;
            buff[i] = c;
        }

        /* Print the line and reset counts if a NEWLINE is encountered. */
        if ( c == NEWLINE )
        {
            buff[i+1] = '\0';
            printf("%s", buff);

            n = -1;
            i = -1;
        }
        /* If the LINE_LENGTH was reached instead, then print up to the last
         * non-space character. */
        else if ( i == LINE_LENGTH - 1 )
        {
            buff[n+1] = '\0';
            printf("%s\n", buff);

            n = -1;
            i = -1;
        }
    }
}

プログラムは、80文字を入力した直後に(まだENTERキーをタップしていないのに)、長さが80の1行の文字だけを出力するようなものになると思いました。ただし、そのようには表示されません。文字数に関係なく、文字列全体を完全に入力できます。最終的に行を終了することにしたとき、Enterキーをタップするだけで、正しい出力が得られます。長い文字列は、80文字の短い断片/行にカットされます(もちろん、最後の文字列にはそれより少ない文字が含まれる場合があります)。 80文字以上)。

なぜそれが起こったのだろうか?

4

2 に答える 2

0

通常(そしてあなたの場合)stdinは行バッファリングされるため、プログラムは入力されたとおりに文字を受け取るのではなく、ユーザーが改行(Return)を入力したとき、またはシステムバッファがいっぱいになったときにチャンクで受け取ります.

そのため、ユーザー入力が最終的にプログラムに送信されると、プログラムの入力バッファーにコピーされます。ここでgetchar()、から文字を読み取りますbuff

入力が十分に長い場合、入力バッファからの文字buffで埋められ、(入力バッファの内容全体が消費されるまで) 数回出力されます。LINE_LENGTH

Linux (一般に Unix っぽいシステムだと思いますが、よくわかりません) では、空でない行にCtrl+を入力することで、改行を入力せずに入力をプログラムに送信することもできます (行の最初の入力として、入力行の後の時点で、2回入力して閉じることができますD) 、したがって、改行なしで[またはそれ以上]文字を入力した後に+を入力すると、[少なくとも最初の部分]入力がすぐに出力されますそれから。stdinstdinCtrlDLINE_LENGTH

于 2013-02-04T15:20:07.363 に答える
0

私も中国から来たので、ここでお会いできてとてもうれしいです。実は、私の英語は苦手です。また、プログラミングも初心者です。だから、私はあなたの目的をよく理解していません。

ただし、コードに問題が見つかりました。ループが停止しない場合があります。EOF はファイルの終わりですが、ファイルを開いていません。

getchar() について私が知っていたのは、標準入力をバター キャッシュに取得することです。getchar() は、入力 (またはループ) を停止するためによく使用されます。

私の答えがお役に立てば幸いです。

于 2013-02-04T15:28:43.580 に答える