【发布时间】:2014-06-04 12:39:40
【问题描述】:
我从昨天开始一直在努力,经过一番努力,我成功地加密了消息。但是,我的输出缺少空格。
据我了解,发生这种情况的原因是因为我正在使用 isalpha()、isupper() 和 islower() 命令,因此忽略了原始输入中的空格。
能否请教我如何保留原来的空格和标点符号?
以下是我的代码 - 它远非优雅,任何风格的 cmet 也将受到赞赏!
(另外,虽然有很多关于 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");
}
更正代码,正常工作:SPOILERS AHEAD
# 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");
}
【问题讨论】:
-
这真的是 C 吗? C 中没有
string类型,您正在使用 C++ 编程。 -
@unwind 这实际上是 C,我自己采用了哈佛 CS50 的在线版本,他们在课程的第一部分将定义字符串类型为 char *,使其更“简单”并且不要让学生对星号和指针感到好奇。
-
注意:不需要
isalpha(p[i])和isupper(p[i])或islower(p[i])。 “isalpha 函数测试任何 isupper 或 islower 为真的字符,......” §7.4.1.2 -
@chux 这是课程工作人员的决定,我只是想提供一些信息,即它实际上是 C 代码。至于未定义的行为,您可以在一个预先配置和修改过的 32 位 fedora 版本的虚拟机中进行所有编程,并使用相同的编译器。因此,工作人员对实际实施有一些断言。测试输入全是
0-127ascii 范围,所以肯定在unsigned char范围内。 -
@chux 至于支持工作人员做出的“简化”决定,这取决于每个人是否同意。我只想指出,这实际上只是他们参加的第一门介绍课程,他们在课程开始几周后就带走了字符串的魔力并谈论指针。
标签: c encryption cs50 caesar-cipher