我的putchar()
函数在求和后返回垃圾。
这是我的代码段:
scanf("%d", & keys);
getchar();
while ((c = getchar()) != EOF)
{
c = c + keys;
putchar(c);
}
puts("");
答案 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
,您都需要做类似的事情来确保自己的目标输出是可打印的。
如果您还有其他问题,请告诉我。