自昨天以来,我一直在努力解决这个问题,经过多次努力,我们成功地加密了这条消息。但是,我的输出缺少空格。
据我所知,发生这种情况的原因是因为我正在使用isalpha(),isupper()和islower()命令,因此我忽略了原始输入中的空格。
请问如何保留原始空格和标点符号?
以下是我的代码 - 它远非优雅,任何对风格的评论也将受到赞赏!
(另外,虽然有很多关于Caesar Cipher的问题,但没有一个问题禁止处理这个问题。由于这是我的第一周编程,我无法理解该语法中的语法。)
我的算法中存在一个明显的错误,如果给出某些参数,它会导致输出错误的值。例如,当k为13时,在第13个字母表后输入任何内容(m,我认为)将输出非常奇怪的东西。 我会修改这个并尽快回来!直到那时,带上我的代码!
# include <cs50.h>
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# include <ctype.h>
int main(int argc, string argv[])
{
if (argc != 2)
{
printf("Please enter a valid number of arguments! \n");
return 1;
}
string num = argv[1];
int k = atoi(num);
if (k < 0)
{
printf("Please enter a valid number! \n");
return 1;
}
printf("Please type the message which needs to be encrypted: ");
string p = GetString();
for (int i = 0, n = strlen(p); i < n; i++)
{
int oldletter = p[i];
int result1 = (oldletter + k);
int result2 = (oldletter - 65 + k);
int result3 = (result2) % 26;
int result4 = (oldletter - 97 + k);
int result5 = (result4) % 26;
if (isalpha(p[i]) && isupper(p[i]) && k < 26)
{
printf("%c", result1);
}
if (isalpha(p[i]) && isupper(p[i]) && k >= 26)
{
int result7 = (result3 + oldletter);
printf("%c", result7);
}
if (isalpha(p[i]) && islower(p[i]) && k < 26)
{
printf("%c", result1);
}
if (isalpha(p[i]) && islower(p[i]) && k >= 26)
{
int result8 = (result5 + oldletter);
printf("%c", result8);
}
}
printf("\n");
}
# include <cs50.h>
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# include <ctype.h>
int main(int argc, string argv[])
{
if (argc != 2)
{
printf("Please enter a valid number of arguments! \n");
return 1;
}
string num = argv[1];
int k = atoi(num);
if (k < 0)
{
printf("Please enter a valid number! \n");
return 1;
}
printf("Message: ");
string p = GetString();
for (int i = 0, n = strlen(p); i < n; i++)
{
int oldletter = p[i];
int result1 = (oldletter - 65 + k);
int result2 = (result1) % 26;
int result3 = (oldletter - 97 + k);
int result4 = (result3) % 26;
if (isalpha(p[i]) && isupper(p[i]))
{
int result5 = (result2 + 65);
printf("%c", result5);
}
else if (isalpha(p[i]) && islower(p[i]))
{
int result6 = (result4 + 97);
printf("%c", result6);
}
else
{
printf("%c", p[i]);
}
}
printf("\n");
}
答案 0 :(得分:2)
当人们实现这一点时,我看到的常见陷阱是直接使用ascii值。考虑制作一个字母数组,你可以在其中获取当前字母的位置,然后确定修改后的字母应该是什么。
想象一下,使用ascii解决方案为此添加一个'%'字符,你最终会有很多特殊的if。如果你愿意,你可以选择忽略空格/等,我个人会将它们添加到字母数组中,这样密文就不会显示空格(给出提示)。
答案 1 :(得分:1)
您可能应该将if
作为else if
链接在一起,如果您的情况之一已经为真,则无需评估if条件。这也允许在isalpha
为false
的情况下执行最终的其他情况,例如空格。
只需将if条件更改为:
if (isalpha(p[i]) && isupper(p[i]) && k < 26)
{
printf("%c", result1);
}
else if (isalpha(p[i]) && isupper(p[i]) && k >= 26)
{
int result7 = (result3 + oldletter);
printf("%c", result7);
}
else if (isalpha(p[i]) && islower(p[i]) && k < 26)
{
printf("%c", result1);
}
else if (isalpha(p[i]) && islower(p[i]) && k >= 26)
{
int result8 = (result5 + oldletter);
printf("%c", result8);
}
else
{
printf("%c", p[i]);
}
我想要注意你的逻辑非常复杂,你还应该选择比当前使用的result*
变量更好的名称,在编程可读性和可维护性方面非常重要。由于您在那里写的小程序,您可以轻松地完成作业而不考虑它们,但这是一个很好的习惯。
我也参加了该课程(具有之前的C经验)并上传了我的最终解决方案,以便在您完成后与您进行比较/改进。只是一个警告,我使用了一个函数,不确定它是否在此问题集之前已经解释过,但至少应该在之后解释。这是我的解决方案:http://pastebin.com/vJqPY6Ne