printf печатает недопустимые символы после каждого числа - PullRequest
0 голосов
/ 06 февраля 2019

При вызове print_compressed () (код приведен ниже) программа печатает символы правильно, но после выполнения printf () (для печати числовых значений) также печатается дополнительный символ.Этот символ не виден на терминале.Но при сохранении вывода в файл он представляется как '^ @' (с использованием редактора nano).

void modify(char *ch, int *cons, char *vow)
{
    if (strchr(vowels, *ch) == NULL) {
        if (*vow) {
            putchar(*vow);
            *vow = 0;
        }
        ++*cons;
    } else {
        if (*cons) {
            printf("%i", *cons);
            *cons = 0;
        }
        if (*vow != *ch)
            putchar(*vow);
        *vow = *ch;
    }    
}

void print_compressed(char *s)
{
    putchar(toupper(*(s++)));
    int curr = 0;
    int cons = 0;
    char vow = 0;
    while (s[curr]) {
        modify(s + curr, &cons, &vow);
        ++curr;
    }
    modify(s + curr, &cons, &vow);
    putchar('\n');
}

Ввод: aaabcdefee

Ожидаемый вывод: Aa3e1e

Вывод на терминал такой же, как и ожидалось

Вывод, когда вывод сохраняется в виде файла: A ^ @ a3 ^ @ e1 ^ @ e

1 Ответ

0 голосов
/ 06 февраля 2019

Посмотрите на логику вашей программы в функции modify.Если вы найдете гласный, вы устанавливаете *vow = 0, если это не было 0 раньше.На следующем шаге, если вы не найдете гласную, вы получите *vow, что является нулевым байтом.После этого вы устанавливаете *vow = *ch.

Таким образом, всегда, когда он не находит гласную и ранее находил гласную, а перед ней не гласную, печатается 0-байт.

Переосмыслите свою логику:)

Или просто измените

if (*vow != *ch)
    putchar(*vow)

на

if (*vow != *ch)
    if (*vow) putchar(*vow);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...