为什么在C语言的printf函数中,取模运算符不起作用?

3

当我删除"%97"时,代码便发挥作用并打印出预期的结果。比如说,如果输入是"a",那么它会打印出"f",而当使用模97时则无法正常工作,只会输出空格。

这个问题背后的原因是什么?如何解决它?

    int main(void)
    {
        char *s = get_string();
        for(int i = 0; i<strlen(s); i++)
        printf("this is %c", (s[i]+5%97));
    }

编辑:大家好,在添加括号后,即更改我的最后一行为“(s[i]+5)%97”后,程序的运行不如预期。当输入“a”时,输出应该是“f”,但实际上是空格。
当我输入“A”时,我得到的是“F”!发生了什么?这个程序的目的是将“a”转换为“a+5”,但它却将“A”转换为“A+5”。请解释一下。

我猜你应该尝试用括号把它改成这样 printf("this is %c", ((s[i]+5)%97)); - Darkpingouin
了解运算符优先级。 - Ed Heal
当然,你最终会得到例如\0代表的Z,这不会打印出任何有用的东西。 - Dietrich Epp
1
你为什么没有将那个复合表达式拆分成更简单的语句,并在printf()之外使用一些额外的临时变量,然后通过调试器逐步执行呢?我不得不问一下,因为这似乎是一个很明显的步骤。 - ThingyWotsit
97这个神奇的数字代表什么? - Andrew Henle
显示剩余2条评论
1个回答

7
我认为您想要写的是:
(s[i] + 5) % 97

您编写的表达式:

s[i] + 5 % 97

与以下代码等价:

s[i] + (5 % 97)

即,运算符%的优先级高于+
你的代码中正在将5(即5 % 97)加到s[i]上。

Neroku感谢您的回复。我已将代码更改为“(s[i] + 5) % 97”,但在输入“a”时,它仍然打印“this is (whitespace)”。而在输入“A”时,它打印“F”。难道相反的情况正在发生吗?因为A的ASCII码是65,而a的ASCII码是97。我希望这个程序将“a”转换为“a+5”,即“f”。 - Yash Gupta
'A' 的 ASCII 码值为 65,那么 (65 + 5) % 97 = 70,即 'F' 的值。对于 'a'(值为 97),则 (97 + 5) % 97 = 5。值为 5 不对应 'f'。 - JFMR
@ChandramauliGupta 那就直接移除模运算。 - JFMR
哦,是的,谢谢 Neroku,我得到了我的答案。多么愚蠢的错误。 - Yash Gupta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接