[英]Function printf() to print backspace problem
有兩個程序,它們得到不同的結果,但是我不明白為什么。 這是第一個:
int main()
{
printf("12345");
fflush(stdout);
printf("\b\b");
fflush(stdout);
return 0;
}
其結果是: 123
。 然后第二個:
int main()
{
printf("12345");
fflush(stdout);
sleep(1);
printf("\b\b");
fflush(stdout);
return 0;
}
但結果是: 12345
。
為什么當我期望結果為“ 123”時,睡眠調用會使第二個結果有所不同? 該代碼在CLion中運行。 如果需要的話,我的操作系統是macOS。
您的代碼首先顯示“ 12345”,然后顯示“ 123”。 如果沒有sleep
,則顯示“ 12345”的時間太短而看不到。 有了sleep
,您可以在刪除“ 4”和“ 5”之前看到“ 12345”大約一秒鍾。
根據終端的不同, '\\b'
可能會“擦除”一個字符或僅將光標移到左側。 要獲得萬無一失的解決方案,請使用:
#include <unistd.h>
#include <stdio.h>
int main(void)
{
printf("12345");
fflush(stdout);
sleep(1);
printf("\b\b \b\b");
fflush(stdout);
}
使用原始代碼(稱為bs97
,從bs97.c
編譯),並使用命令行提示符Osiris JL:
bs97.c
獲得輸出:
Osiris JL: bs97
123Osiris JL:
請注意,新提示已覆蓋45
。 您可以看到,如果添加putchar('\\n');
在第二個fflush()
。 (我在int main(void)
添加了void
,以避免使用默認的編譯選項進行編譯警告(錯誤)。)
Osiris JL: make bs97 && bs97
gcc -O3 -g -std=c11 -Wall -Wextra -Werror -Wmissing-prototypes -Wstrict-prototypes bs97.c -o bs97
12345
Osiris JL:
這次, 4
和5
仍然可見。
僅僅使用退格鍵並不會擦除以前存在的內容。 它將寫位置放在屏幕后方一個位置,僅此而已。 如果要擦除其中的內容,則需要輸出printf("\\b \\b\\b \\b")
以返回,輸出空格並再次返回-重復兩次。 或者,您可以使用printf("\\b\\b ")
,但這將在兩個空格之后保留寫位置。 或者您可以使用printf("\\b\\b \\b\\b")
在3
之后離開寫入位置。 這個主題還有其他變化。
在第二個程序進入睡眠狀態后,我會得到類似的行為,除了在程序進入睡眠狀態時顯示12345
。
我正在使用自制的GCC 8.2.0或XCode 10.0的clang
編譯器在運行macOS 10.14 Mojave的Mac上進行測試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.