簡體   English   中英

函數printf()打印退格問題

[英]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: 

這次, 45仍然可見。

僅僅使用退格鍵並不會擦除以前存在的內容。 它將寫位置放在屏幕后方一個位置,僅此而已。 如果要擦除其中的內容,則需要輸出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.

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