私は今、プログラムを理解しているようですが、重要なことには実際には使用されない文字配列にすべての戻り値をgetline
コピーするように見えるため、関数はあまり直感的ではありません。getchar()
s[]
int getline(char s[], int lim)
{
int c, i;
for(i=0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; ++i)
s[i] = c;
if(c == '\n')
{
s[i] = c;
++i;
}
s[i] = '\0';
return i;
}
関数が実際に行っているのは、到達または復帰するs[i] = c;
までの文字数をカウントすることだけであるため、関数はその行を簡単に無視できます。EOF
'\n'
getchar()
私が本当に理解していないのは、メインループが次のようにプログラムが前進した理由です。
main()
{
int len; /* current line length */
int max; /* maximum length seen so far */
char line[MAXLINE]; /* current input line */
char longest[MAXLINE]; /* longest line saved here */
max = 0;
while ((len = getline(line, MAXLINE)) > 0)
if (len > max)
{
max = len;
copy(longest, line);
}
if (max > 0) /* there was a line */
printf("%s", longest);
return 0;
}
唯一の説明はgetchar()
、ユーザーがテキストの全行を入力し、enterキーを押した後に、関数がその魔法を実行するということです。したがって、実行時に動作するように見えると思います。
番組進行はこんな感じ?プログラムは最初に while ループに入り、次にユーザーがテキスト行を入力するのを待ち、ユーザーが Enter キーを押すと、getline
関数の for ループが繰り返されますか? ユーザーは入力中に入力できるので、これが当てはまるように感じbackspaceます。
私の質問は、プログラムはどのように正確に前進するのですか? それはすべてgetchar()
機能のためですか?
ctrlターミナルで-Dを押すと、他にも紛らわしいことが起こります。改行の先頭でctrl-Dを押すと、プログラムは終了します。ctrlあるテキストで満たされた行の最後で-を打った場合D、それは終了せず、 を打ったのと同じように動作しませんenter。ctrl-をDテキスト行で数回押すと、プログラムは最終的に終了します。
これは私の端末がセッションを処理している方法ですか、それとも単に C を学びたいのであれば心配する必要はありませんか?
私が尋ねる理由は、プログラムをよく理解するためにトレースするのが好きだからですが、getchar()
関数がそれを難しくしています。