簡體   English   中英

如何使用GCC在C程序中的函數之間暫停?

[英]How to pause between functions in a program in C with GCC?

所以我的問題是我的程序運行得太快,以至於我無法看到它的行為方式。 它應該使文本沿終端的邊緣爬行。 我嘗試使用sleep()printf(...) s之間做一個短暫的暫停,以便我可以在打印時看到文本的位置。

這就是它的樣子:

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

所以我在printf之后放了sleep()函數,這樣它會在再次啟動循環之前暫停並使文本緩慢移動。 但是,它會在程序開始之前無限期地暫停程序。 這也發生在usleepsystem("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

謝謝您的回答

你的觀察不是因為sleep()不起作用,而是因為printf()使用stdout ,這是行緩沖的。 “line buffered”意味着,已經寫入stdout被緩沖,直到在緩沖區內容被刷新之前到達行尾。

所以在第一次printf("HELLO"); 輸出不會進入屏幕而是停留在緩沖區中,然后進入sleep(1); 被執行並讓你等待。 然后是下一個printf("HELLO"); 輸出仍然沒有進入屏幕,但下面的sleep(1); 再次讓你等待1秒......依此類推,直到你的程序通過程序打印'\\n'或程序結束到達行結束,這會隱式地將輸出緩沖區刷新到控制台。

您可以通過在每個printf()之后顯式刷新stdout的輸出緩沖區來避免此行為:

#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;
}

我通常做的快速黑客是制作一些緩沖區數組(例如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這樣的專用調試器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM