Переопределить предыдущую строку в stdout с помощью \ r - PullRequest
0 голосов
/ 26 сентября 2019

Поэтому обычно, когда я хочу напечатать что-то в предыдущей строке в терминале, я просто делаю:

printf("\rprint a number %d", number);
fflush(stdout);

Так что для программы, которую я пишу, я хотел сделать именно это и попытался:

printf("\r%s - %s", buffer1, buffer2);
fflush(stdout);

Где

buffer1, buffer2 = malloc(sizeof(char)*100);

Это, однако, не работает, оно печатает на новой строке каждый раз.Я предполагаю, что это как-то связано со мной, используя char * вместо char [100] или с их размером?

Пример вывода (цвета удалены из кода для простоты):

sample

edit: buffer_1 заполняется в другом потоке от stdin:

while (true) {
    system("/bin/stty raw");
    c = getchar();
    system("/bin/stty cooked");
    if (c == ' ') {
        return;
    }
    // check if input is not to long
    if (i == MAX_INPUT_LENGTH) {
        return;
    }
    // Get the latest added char and add to buffer
    t_a->input_buffer[i] = c;
    i += 1;
}

И buffer_2 назначается выход из system(find)команда:

 FILE *fp = popen("find -name a ", "r");
 char temp_buf[1024];
 // Get output of find command
 int i = 0;
 while (fgets(temp_buf, sizeof(temp_buf), fp) != 0 && i < MAX_NUM_RESULTS) {
     strcpy(result_buffer[i], temp_buf);
     i += 1;
 }

pclose(fp);

Любые подсказки приветствуются.

Ответы [ 2 ]

1 голос
/ 26 сентября 2019

Проблема заключалась в том, что вывод system(find) содержал новую строку в конце результата.Я исправил это, не копируя последний символ:

 strncpy(result_buffer[i], temp_buf, strlen(temp_buf)-1);

Спасибо за комментарии, указывающие мне туда!

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

Если вы не знаете, сколько у вас есть перевода строки, вы можете использовать функцию strspn в цикле, чтобы удалить все вхождения \n:

#include <stdio.h>
#include <string.h>
void remove_line_feeds(char *sz)
{
    size_t len = strlen(sz);
    size_t pos;

    while ((pos = strspn(sz, "\n"))!= len)
    {
        sz[pos] = ' ';
    }
}

int main(void)
{
    char sz[] = "text\nwith\nline\nfeed";

    printf("'%s'\n", sz);

    remove_line_feeds(sz);

    printf("'%s'\n", sz);
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...