私は自分自身の啓蒙のために K&R (第 2 版) に取り組んでおり、次の演習 (演習 2-2 p42) に遭遇しました。
Write a loop equivalent to the following without using && or ||:
for (i=0; i<lim-1 && (c=getchar()) != '\n' && c != EOF; ++i)
s[i] = c;
これが私の解決策でした:
#include <stdio.h>
/* write a loop equivalent to the following without using && or ||
for (i=0; i<lim-1 && (c=getchar()) != '\n' && c != EOF; ++i)
s[i] = c;
*/
int main()
{
int counter = 0, lim = 1000;
int s[lim], c;
while(counter < lim-1)
{
while((c = getchar()) != '\n')
{
while(c != EOF)
{
s[counter] = c;
}
}
counter++;
}
return 0;
}
インデントされたループを期待していたので、改行文字 ( '\n'
) または EOF 文字 (Ctrl-d
私の Linux マシン上) に遭遇すると、プログラム全体が正常に終了することを期待していましたが、驚いたことに、うまくいきました。gdb を使用してデバッグしようとしましたが、まだ理解できませんでした。
何が表示されないのですか?
補遺: while ループが実行する一連のテストを逆にして、外側のループ if から抜け出すために if ステートメントを追加しようとしましたが、c == '\n'
まだ表示されません! c
また、実行可能ファイルの実行中のコピーの pid に gdb をリンクしようとした場合でも、GDB を実行してコマンド ラインにテキストを入力し、同時に の値を出力しようとするのが困難です。この演習を解決するには、おそらく他の方法があることを認識しています。たとえば、OK_TO_EXECUTE
3 つの条件がすべて満たされた場合にのみ true になるフラグまたは変数を設定するなどです。 . まさにこれが、私が K&R に戻って本をより徹底的に読み、演習を適切に解決する理由です。
コードをやり直しました(まだバグがあります!!!):
#include <stdio.h>
/* write a loop equivalent to the following without using && or ||
for (i=0; i<lim-1 && (c=getchar()) != '\n' && c != EOF; ++i)
s[i] = c;
*/
int main()
{
int counter = 0, lim = 1000;
int s[lim], c;
while((c = getchar()) != EOF)
{
if ( c == '\n')
break;
while(c != '\n')
{
while(counter < lim-1)
{
s[counter] = c;
counter++;
}
}
}
return 0;
}
解決しました!- おもう!やっと分かった気がします。私のやり直したソリューションに書かれている内部ループlim
は、到達するまで無限にループするか、少なくともループします。break ステートメントを追加しましたが、解決策に向かっていると思います。
ただし、この問題で gdb を実行する方法にまだ取り組んでいます。コマンド ライン エントリとprint
の値を入力しますc
。gdb を実行可能ファイルの pid にリンクしても、期待どおりに動作しませんでした。gdb に関する別の質問も投稿しました。