Мусор печатается после последнего символа путчаром - PullRequest
0 голосов
/ 14 апреля 2019

Моя putchar() функция возвращает мусор после внесения суммы.

Вот мой фрагмент кода:

scanf("%d", & keys);
getchar();
while ((c = getchar()) != EOF)
{
    c = c + keys;
    putchar(c);
}
puts("");

1 Ответ

0 голосов
/ 14 апреля 2019

Если я понимаю, куда вы идете, ваша проблема (забавные символы в конце) связана с добавлением c = c + keys;, в результате чего значение символа больше 126 (например, '~' char). Например, если ваш keys больше 4 и вы ввели 'z', то полученный вами c + keys находится за пределами допустимого диапазона символов ASCII. См. Таблица ASCII и описание

В зависимости от того, что вы хотите сделать, вы можете просто использовать % (по модулю), чтобы убедиться, что у вас всегда есть действительный символ ASCII перед вызовом putchar(). Что-то вроде:

    while ((c = getchar()) != EOF) {
        c = (c + keys) % ('~' - ' ' + 1) + ' '; /* use modulo to ensure ASCII */
        putchar (c);
    }

( примечание: '~' - ' ' + 1 - это просто диапазон значений ASCII для печати - 95 символов - спасибо, Роланд)

Составив предположение о коротком примере программы, которая, кажется, находится там, куда вы идете, вы можете сделать:

#include <stdio.h>

/* simple helper function to remove to end of line */
void empty_line (void)
{
    int c = getchar();

    while (c != '\n' && c != EOF)
        c = getchar();
}

int main (void) {

    int c, keys;

    if (scanf("%d", & keys) != 1 || keys < 0) { /* Validate EVERY Input! */
        fputs ("error: invalid or negative integer input.\n", stderr);
        return 1;
    }
    empty_line();

    while ((c = getchar()) != EOF) {
        c = (c + keys) % ('~' - ' ' + 1) + ' '; /* use modulo to ensure ASCII */
        putchar (c);
    }
    putchar ('\n');     /* not puts, you need 1-char, not string */
}

( примечание: необходимо проверить каждый вход, особенно при использовании scanf для выполнения преобразования в int - или любой другой тип)

Пример использования / Вывод

$ ./bin/putcharmod
33
My dog has zero fleas, my cat has none :)
/[aFQIaJCUa\GTQaHNGCUmaO[aECVaJCUaPQPGa{jK

Выше, несмотря на keys = 33, ввод 'z' не приводит к появлению смешных символов, так как общее количество c + keys уменьшается до диапазона печатаемых символов.

Конечно, настройте схему так, чтобы она соответствовала вашей конечной цели, но независимо от того, если вы выводите в stdout с помощью putchar(), вам нужно будет сделать что-то подобное, чтобы убедиться, что то, что вы выводите, доступно для печати.

Дайте мне знать, если у вас есть дополнительные вопросы.

...