[英]How to pause between functions in a program in C with GCC?
所以我的問題是我的程序運行得太快,以至於我無法看到它的行為方式。 它應該使文本沿終端的邊緣爬行。 我嘗試使用sleep()
在printf(...)
s之間做一個短暫的暫停,以便我可以在打印時看到文本的位置。
這就是它的樣子:
http://i.imgur.com/B6FFbNp.gif
所以我在printf
之后放了sleep()
函數,這樣它會在再次啟動循環之前暫停並使文本緩慢移動。 但是,它會在程序開始之前無限期地暫停程序。 這也發生在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
謝謝您的回答
你的觀察不是因為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.