Вращающееся косое колесо обозначает текущую операцию [closed]

Я написал простую программу, показывающую, как компьютер выполняет операцию. Предполагается, что через каждую секунду пользователю будет отображаться вращающийся символ косой черты, однако программа не работает должным образом. Он показывает все символы вместо очистки экрана и показывает только вращающийся символ косой черты.

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

int main(){
char wheel[3] = {'\','|',"https://codereview.stackexchange.com/"};

int j=0;
int i = 0;
while(j<6){
    printf("[%c]",wheel[i]);
    sleep(1);
    system("clear");
    i++;
    if(i>2) i=0;
    j++;
}


return 0;
}

4 ответа
4

Обычно вы хотите использовать либо b или же r чтобы позволить новому выводу перезаписать старый вывод без очистки всего экрана.

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

#define elements(x)  (sizeof(x)/sizeof(x[0]))

int main(){
    char wheel[] = {'\','|',"https://codereview.stackexchange.com/", '-'};

    for (int i=0; i<30; i++) {
        printf("r%c", wheel[i%elements(wheel)]);
        fflush(stdout);
        sleep(1);
    }
}

r — это возврат каретки, поэтому он позволяет повторно распечатать всю текущую строку вывода.
b — это backspace, поэтому он позволяет вам перезаписать один символ. В этом случае у нас есть только один символ в строке, поэтому любой из них работает одинаково. Если вы хотите сделать что-то в таком порядке, было бы полезно использовать backspace:

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

#define elements(x)  (sizeof(x)/sizeof(x[0]))

int main(){
    char wheel[] = {'\','|',"https://codereview.stackexchange.com/", '-'};

    // something written outside the processing loop that needs to be preserved
    printf("Please wait--processing ");

    for (int i=0; i<30; i++) {
        // just overwrite the one character for the spinner:
        printf("b%c", wheel[i%elements(wheel)]);
        fflush(stdout);
        sleep(1);
    }
    printf("n");
}

  • Не то чтобы это сильно изменилось, но у OP есть счетчик в квадратных скобках.

    — Дедупликатор

  • Обратите внимание, что вопросы, связанные с кодом, который работает не так, как задумано, не относятся к теме на этом сайте. Если OP редактирует свое сообщение, чтобы решить проблему и сделать свое сообщение по теме, они сделают ваш ответ спорным. На такие вопросы рекомендуется не отвечать.. Совет: нужно ответить на множество вопросов по теме; вы быстрее заработаете себе репутацию, если проанализируете код в вопросах, которые получат больше просмотров из-за того, что они соответствуют теме.

    — БУДЕТ ВКЛЮЧЕНОᴇᴌᴀ

Если вы используете Windows, команда будет «CLS», а не «clear». Изучение по модулю очень поможет вам в программировании — здесь вы можете использовать wheel[j%3] и пропустите переменную i. Также попробуйте найти способ переместить курсор вместо очистки всего экрана.

  • Нет, я использую стандартные библиотеки (nix *). Хорошее предложение по модулю, однако я не знаю, как удалить символ из стандартного вывода.

    — MossMan

  • Обратите внимание, что вопросы, связанные с кодом, который не работает должным образом, на этом сайте не по теме. Если OP редактирует свое сообщение, чтобы решить проблему и сделать свое сообщение по теме, они сделают ваш ответ спорным. На такие вопросы рекомендуется не отвечать.. Совет: нужно ответить на множество вопросов по теме; вы быстрее заработаете себе репутацию, если проанализируете код в вопросах, которые получат большее количество просмотров из-за того, что они соответствуют теме.

    — БУДЕТ ВКЛЮЧЕНОᴇᴌᴀ

Проблема заключалась в том, что перед сном мне пришлось вручную очистить содержимое stdout, и поэтому я ничего не получил на экране, поскольку printf буферизует вывод, у меня либо должен быть новый символ строки, который сообщает буферу для очистки или использования fflush (stdout) перед вызовом функции сна.

Этот ответ был полезен.
https://stackoverflow.com/questions/13568388/c-sleep-function-not-working

В колесной базе отсутствует горизонтальная спица колеса -.

Массив колес не требует номера для его инициализации.

    char wheel[] = {'\','|',"https://codereview.stackexchange.com/"};

Размер массива можно определить по:

    size_t wheel_size = sizeof(wheel) / sizeof(*wheel);

Предпочитать size_t над int при индексировании массивов. size_t беззнаковый и может предотвратить использование отрицательного значения в качестве индекса.

Затем цикл можно записать только с точки зрения размера колеса, используя по модулю, как было предложено в другом ответе.

size_t j=0;
while(j < (2 * wheel_size)){
    printf("[%c]",wheel[j % wheel_size]);
    sleep(1);
    system("clear");
    j++;
}

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *