【发布时间】:2020-03-18 14:33:05
【问题描述】:
我正在通过 cs50 并且我被困在 pset2 凯撒上。我按照指示一步一步地进行操作,并且我已经完成了关于验证密钥的部分——确保命令行参数只是一个数字(./caesar 20),如果不是(./caesar 20x 或./caesar xyz) 打印出用法:./caesar key\n。但是,一旦我添加下一行以提示用户输入明文,然后打印回密文,它似乎并没有注册验证密钥的前几行。我知道哈佛的学术诚信政策,所以我更多地寻求提示/帮助/解释。我已经在下面发布了我的代码,非常感谢任何帮助。
int main(int argc, string argv[])
{
int i = 0;
if(isalpha(argv[1][i]))
{
printf("Usage: ./caesar key\n");
return 1;
}
else
{
int key = atoi(argv[1]);
string text = get_string("plaintext: ");
printf("ciphertext: ");
int n = strlen(text);
for(i = 0; i < n; i++)
{
if(isupper(text[i]))
{
printf("%c", (((text[i] - 65) + key) % 26) + 65);
}
else if(islower(text[i]))
{
printf("%c", (((text[i] - 97) + key) % 26) + 97);
}
else
{
printf("%c", text[i]);
}
}
}
printf("\n");
return 0;
}
【问题讨论】:
-
它只是可读性的东西,但使用像
'a'这样的字符文字而不是它们的 ASCII 值。 -
printf("Usage: ./caesar key\n"); return 1;是一种反模式。如果没有错误,你应该return 0。如果出现错误,则应将错误消息写入 stderr。使用语句不是错误消息(无数恼人的程序将 100 行使用语句作为错误消息写入标准错误,然后当用户重新运行带有| less附加的程序时,寻呼机会绕过这些程序)。在这种情况下,无效字符是错误,但用法语句是不正确的响应。指定错误,并写入标准错误。 -
我不确定您的问题是什么,但要调试,请将密码计算分配给一个变量,并在打印之前使用调试器检查该变量。
-
我假设
get_string获取一个字符串并分配一个它返回的缓冲区? -
不要对“65”、“97”和“26”等值进行硬编码。很确定你想要
'A'、'a'和'z' - 'a' + 1。 (可以说 26 是可以的,但你肯定想要'a'和'A'而不是 97 和 65。