3

したがって、私の問題は、プログラムの実行が速すぎて、どのように動作するかを確認できないことです。テキストが端末の端に沿って這うようにすることになっています。印刷中にテキストがどこに行くのかを確認できるように、s のsleep()間に短い一時停止を作成するために使用しようとしました。printf(...)

これは次のようになります。

http://i.imgur.com/B6FFbNp.gif

そのためsleep()、関数をprintfs の後に配置して、ループを再開する前に一時停止し、テキストをゆっくりと動かします。しかし、何が起こるかというと、プログラムが開始する前に無期限に一時停止します。これは と の場合にも起こりusleepますsystem("pause 1")。これは次のようになります。

http://i.imgur.com/krGW3lB.gif

================================================== ================================

編集:

わかりました、私は自分でそれを理解しました。文字列sleep()を入れた場合にのみ機能するようです。\nどうしてか分かりません。私はいまいましいマニュアルでこれを読んだことさえありませんでした。

だからあなたが持っているなら

printf("HELLO\n");
sleep(3);
printf("HELLO\n");
sleep(3);
printf("HELLO\n");

次のようになります。

HELLO

【3秒静止】

HELLO

【3秒静止】

HELLO

ただし、改行文字を削除すると、次のようになります。

[9秒間静止] HELLO HELLO HELLO

なぜこれが起こるのかわかりませんが、そうです

================================================== ================================ 編集:

これが私のプログラムの動作方法です: http://i.imgur.com/DXv7E60.gif

回答ありがとうございます

4

2 に答える 2

6

あなたの観察は、機能していないためではなく、ラインバッファリングされたを使用sleep()しているという事実によるものです。「ラインバッファリング」とは、バッファの内容がフラッシュされる前に、行の終わりに到達するまで、書き込まれたものがバッファリングされることを意味します。printf()stdoutstdout

したがって、最初printf("HELLO");の出力の後、出力は画面に表示されずにバッファに留まり、sleep(1);実行されて待機します。次にprintf("HELLO");、出力はまだ画面に表示されませんが、次の場合も sleep(1);1秒間待機します...プログラムがaを出力する'\n'か、プログラムの最後に到達した場合は行末まで、暗黙的にフラッシュしますコンソールへの出力バッファ。

stdoutの出力バッファを毎回明示的にフラッシュすることで、この動作を回避できますprintf()

#include <stdio.h>
#include <unistd.h>

int main(void)
{
  printf("HELLO");
  fflush(stdout);
  sleep(3);
  printf("HELLO");
  fflush(stdout);
  sleep(3);
  printf("HELLO");
/* fflush(stdout); */ /* not needed as buffers are implicitly flushed on the program's end */

  return 0;
}
于 2013-06-23T08:01:37.703 に答える
1

私が通常行う簡単なハックは、バッファ配列 (例: char buf[10]) を作成し、反復の間に fgets() を配置することです。これにより、プログラムはユーザーからの改行を強制的に待機します。たとえば、次のような場合:

.
.
.
for(i = 0; i < 1000000; ++i)
    printf("%d\n", i);

次にできること

.
.
.
char buf[10];
for(i = 0; i < 1000000; ++i){
    printf("%d\n", i);
    fgets(buf, 10, stdin);
}

エンターキーで繰り返しを制御します。

モジュラスを使用して、n 回ごとの反復を停止することもできます。上記の例を使用して、100 回の反復ごとに停止します。

.
.
.
char buf[10];
for(i = 0; i < 1000000; ++i){
    printf("%d\n", i);
    if(i % 100 == 0)
        fgets(buf, 10, stdin);
}

時間はかかりますが効率的な方法は、GDB のような専用のデバッガーを使用することです。

于 2013-06-23T05:50:43.183 に答える