这是我在这里发表的第一篇文章,我试图尽可能地使用标题。对不起,如有任何错误:)
我正在为CS课程做我的pset而且我有打印我的价值的问题。当我把这样的值放在:(%c, p[j] + k%26)
时,程序会打印它。当我把它放在括号中时,它没有。在这种情况下,这是一个重要的区别。
你对我有什么建议吗?如果是这样,请不要编写任何代码,因为我们不允许从外部接收任何代码。请告诉我,如果在C中我正在做的事情是非法的,或者可能会提出一些可能有帮助的开放式问题!
守则的相关部分
for (int j = 0, m = strlen(p); j < m; j++)
{
if (isalpha(p[j]))
{
printf("%c", (p[j] + k)%26);
}
else
{
printf("%c", p[j]);
}
}
答案 0 :(得分:5)
您的意思是括号。
此:
p[j] + k % 26
不同于:
(p[j] + k) % 26
因为operator preceding,模数将在加法之前执行。但是,括在括号中的公式将具有最高的前缀,因此将首先执行。
结果在第一种情况下,k % 26
将首先执行,其结果将添加到p[j]
。
在第二种情况下,p[j]
将添加到k
,该金额将受% 26
影响。
正如您所看到的,这两件事情是不同的,从而解释了您所经历的不同行为。
正如Eugene所提到的,ascii值从0到25的字符并不总是可打印的。
答案 1 :(得分:2)
执行(p[j]+k)%26
时,您获得0-25
之间的值。参考ASCII表,这些值代表控制字符。
我假设您正在为某些密码编码。在这种情况下,您只需要从p[i]+j
中减去26。请记住,字母的ASCII值不是0-25
答案 2 :(得分:0)
预计在角色中添加一个偏移是某个角色,在第一种情况下可能在p[j]
到p[j]+25
的范围内,在第二种情况下也可以
你只是尝试打印ascii值为0到25的东西,这可能是不可打印的东西。
但在这两种情况下,您可能会遇到不可打印的问题。
%
的优先级高于+
,因此在第一种情况下
p[j] + (k%26)
在第二种情况下
(p[j] + k)%26
答案 3 :(得分:0)
这是两个不同的事情,因为%
运算符优先于总和,所以这是数学的问题。代码
printf("%c", (p[j] + k)%26);
始终打印一个字符,但在这种情况下,您将模数操作(%
)应用于最终值,从而产生0到25之间的数字。请注意,此字符都不可打印(即它们是空格或其他---请参阅ASCII表格。
答案 4 :(得分:0)
好吧,因为结果将是一些从 0 到 25 的数字,顺便说一句,在 ascii 代码中是不可打印的,所以如果数字是大写,则必须添加 65,如果数字是小写,则必须添加 97 此处是 the ascii code table 以了解更多
<EmbeddedResource Update="Migrations\202107071914322_WhateverMigration.resx">
<Generator></Generator>
<DependentUpon>202107071914322_WhateverMigration.cs</DependentUpon>
</EmbeddedResource>