Putchar在最后一个字符之后打印垃圾

时间:2019-04-14 02:28:00

标签: c ansi

我的putchar()函数在求和后返回垃圾。

这是我的代码段:

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

1 个答案:

答案 0 :(得分:0)

如果我知道您要去的地方,那么您的问题(结尾处的有趣字符)是由于您添加了c = c + keys;而导致的字符值大于126(例如{{1 }} char)。例如,如果您的'~'大于keys,并且您输入了4,则结果'z'超出了ASCII字符的有效范围。参见ASCII Table and Description

根据您要执行的操作,您可以简单地使用c + keys(取模)来确保在调用%之前始终具有有效的ASCII字符。像这样:

putchar()

注意: while ((c = getchar()) != EOF) { c = (c + keys) % ('~' - ' ' + 1) + ' '; /* use modulo to ensure ASCII */ putchar (c); } 只是ASCII值的可打印范围-'~' - ' ' + 1字符-感谢Roland)

将您可能要去的简短示例程序汇总在一起,您可以这样做:

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,您都需要做类似的事情来确保自己的目标输出是可打印的。

如果您还有其他问题,请告诉我。