Почему у меня проблема с выравниванием при отображении символов ASCII в цикле? - PullRequest
0 голосов
/ 17 февраля 2019

Я хочу написать программу, которая печатает каждую букву с номером ASCII.Программа должна напечатать 8 букв с номером ASCII в одном стихе, поэтому я решил создать счетчик, и в каждом цикле он должен увеличивать эту переменную.

Проблема более заметна на этом скриншоте:

program output

Почему пробелы не равны?Я думаю, что с циклом что-то не так.

Мой код:

int main(void) {
    char ch;
    int flag = 0;
    while ((ch = getchar()) != '#') {
        if (isalpha(ch)) {
            flag++;
            printf("%c : %d \t", ch, ch);
        }
        if ((flag % 8) == 0) {
            printf("\n");
        }
    }
    return 0;
}

Ответы [ 2 ]

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

Цикл почти в порядке, вам нужно больше теста на flag внутри теста на isalpha(c) в противном случае вы можете напечатать несколько новых строк, если набор букв не был смежным.

Проблема выравнивания возникаетиз числа символов, выводимых перед табуляцией: "%c : %d \t" создает один символ для %c, 3 символа для :, до 3 символов для %d и еще один символ для : это 8 символов дляc >= 100.Символ TAB расширяется до количества пробелов, необходимого для достижения кратного столбцу числа 8. Следовательно, 1 пробел для c < 100 и 8 пробелов для c >= 100.

Это можно исправить, удалив лишний пробел перед\t.

Также обратите внимание, что вы должны прочитать байты из входного потока в переменную int и проверить на EOF тоже.

Вот измененная версия:

int main(void) {
    int ch;
    int flag = 0;
    while ((ch = getchar()) != EOF && c != '#') {
        if (isalpha(ch)) {
            printf("%c : %d\t", ch, ch);
            flag++;
            if ((flag % 8) == 0)
                printf("\n");
        }
    }
    return 0;
}
0 голосов
/ 17 февраля 2019

Ничего плохого в петле.его причины для дополнительного "" (пробела) перед \t.замените вашу первую функцию printf следующим:

printf("%c : %d\t", ch, ch);.

Пробелы будут равны.

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