【发布时间】:2014-07-17 20:14:12
【问题描述】:
这是 edx.org 的 cs50x 课程的 pset2 中的凯撒密码加密问题。
我已经用另一种算法解决了这个问题,但这是我第一次尝试,我仍然很好奇为什么所有这些符号都出现在凯撒文本的右侧。
即。我输入文本“Testing”,输出为“Fqefuz�����w����l��B��”,但没有符号,答案是正确的。
谁能解释一下?
int main(int argc, string argv[])
{
bool keyOk = false;
int k = 0;
do
{
if(argc != 2) // Checking if the key was correctly entered.
{
printf("You should enter the key in one argument from"
" the prompt(i.e. './caesar <key>').\n");
return 1;
}
else
{
k = atoi(argv[1]); // Converting string to int.
keyOk = true; // Approving key.
}
}
while(keyOk == false);
string msg = GetString(); // Reading user input.
char caesarMsg[strlen(msg)];
for(int i=0, n = strlen(msg); i < n; i++)
{
if( (msg[i] >= 'a') && (msg[i] <= 'z') )
// Processing lower case characters
{
caesarMsg[i] = ((((msg[i] - 97) + k) % 26) + 97);
}
else if( (msg[i] >= 'A') && (msg[i] <= 'Z') )
// Processing upper case characters
{
caesarMsg[i] = ((((msg[i] - 65) + k) % 26) + 65);
}
else
{
caesarMsg[i] = msg[i];
}
}
printf("%s", caesarMsg);
printf("\n");
}
【问题讨论】:
-
您新编码的字符串缓冲区太小了 1 个字节。您还需要为终止零留出空间。 (此外,您甚至不添加终止零。)
-
char caesarMsg[strlen(msg)];-->char caesarMsg[strlen(msg)+1]; -
我已经尝试过这个“char caesarMsg[strlen(msg)+1];”并且不工作。我最近读到关于终止零,我会记住的。感谢您的回答。
-
OT:如果您要检查文字字符 'a'..'z' 和 'A'..'Z',最好在接下来的计算中也使用它们,而不是半魔法值“97”和“65”。