Если я понимаю, куда вы идете, ваша проблема (забавные символы в конце) связана с добавлением 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()
, вам нужно будет сделать что-то подобное, чтобы убедиться, что то, что вы выводите, доступно для печати.
Дайте мне знать, если у вас есть дополнительные вопросы.