Функция printf () для печати проблемы возврата - PullRequest
0 голосов
/ 27 сентября 2018

Есть две программы, и они получают разные результаты, но я не понимаю, почему.Вот первое:

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, если это имеет значение.

Ответы [ 3 ]

0 голосов
/ 27 сентября 2018

В зависимости от терминала, '\b' может «стереть» символ или только переместить курсор влево.Чтобы получить надежное решение, используйте:

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

int main(void)
{
    printf("12345");
    fflush(stdout);
    sleep(1);
    printf("\b\b  \b\b");
    fflush(stdout);
}
0 голосов
/ 27 сентября 2018

С исходным кодом (называемым bs97, скомпилированным из bs97.c) и с моей подсказкой командной строки Osiris JL: я получаю вывод:

Osiris JL: bs97
123Osiris JL:

Обратите внимание, что новое приглашение имеетперезаписать 45.Вы можете видеть это, если вы добавите putchar('\n'); после второго fflush().(Я добавил void к int main(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 все еще видны.

Простое использование backspace не стирает содержимое, которое было там ранее; позиционирует позицию записи на экране на одно место, вот и все.Если вы хотите стереть то, что было там, вам нужно вывести printf("\b \b\b \b"), чтобы вернуться назад, вывести пробел и вернуться снова - повторить дважды.Или вы могли бы использовать printf("\b\b "), но это оставило бы позицию записи после двух пробелов;или вы можете использовать printf("\b\b \b\b"), чтобы покинуть позицию записи после 3.И есть другие варианты этой темы.

Со второй программой со сном я получаю аналогичное поведение, за исключением того, что 12345 отображается, пока программа спит.

I 'm тестирование на Mac под управлением MacOS 10.14 Mojave с использованием самодельного GCC 8.2.0 или компилятора clang из XCode 10.0.

0 голосов
/ 27 сентября 2018

Ваш код сначала отображает «12345», а затем отображает «123».Без sleep «12345» отображается слишком мало времени, чтобы быть видимым.С sleep вы можете увидеть «12345» примерно за секунду до того, как «4» и «5» будут удалены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...