cs50 pset2 caesar---验证密钥
cs50 pset2 caesar---validating the key
我正在学习 cs50,但卡在 pset2 caesar 上。我按照指示一步一步地进行,我通过了关于验证密钥的部分——确保命令行参数只是一个数字 (./caesar 20),如果不是 (./caesar 20x 或./caesar xyz) 打印出来 用法:./caesar key\n。但是,一旦我添加下一行以提示用户输入明文,然后打印回密文,它似乎就不会注册验证密钥的前几行。我知道哈佛的学术诚信政策,所以我更希望 hints/help/explaination 提出这个要求。我在下面发布了我的代码,非常感谢任何帮助。
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;
}
您需要重新进行输入验证。
- 它不能确保在命令行中提供一个参数。
- 它仅验证
argv[1]
的 第一个字符 。程序应测试参数的 每个 字符都是数字(参见 man isdigit
)。 isalpha()
不是一个好的测试。如果用户输入 $
怎么办?
尚不清楚程序何时无法运行,但基于这些缺陷,这不会通过 check50。
您必须检查命令行参数中的两件事。
1. 检查你是否有 2 个参数。 (这在您的程序中未选中)
2. 检查它是否不是字母表... 因为第二个参数自动是一个字符串(由于 string argv[]),你必须先将它转换为整数。 ---- 这会产生您必须通过以下方式解决的子问题:
2.A。逐一检查字符串(每个字符),所有字符串都必须是整数。
2.B。如果至少有一个是字符,则 return false...
2.A。和 2.B。应该嵌套在一个单独的函数中,该函数将 return 一个布尔值 (T/F),然后根据该布尔值,将这两个布尔表达式包含在 while 循环中。
我的回答晚了 2 个月,但由于我刚刚解决了这个问题,我想也许有人可能遇到了我遇到的同样的困难,所以希望有人能读到这篇文章并帮助他们。 :)
我正在学习 cs50,但卡在 pset2 caesar 上。我按照指示一步一步地进行,我通过了关于验证密钥的部分——确保命令行参数只是一个数字 (./caesar 20),如果不是 (./caesar 20x 或./caesar xyz) 打印出来 用法:./caesar key\n。但是,一旦我添加下一行以提示用户输入明文,然后打印回密文,它似乎就不会注册验证密钥的前几行。我知道哈佛的学术诚信政策,所以我更希望 hints/help/explaination 提出这个要求。我在下面发布了我的代码,非常感谢任何帮助。
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;
}
您需要重新进行输入验证。
- 它不能确保在命令行中提供一个参数。
- 它仅验证
argv[1]
的 第一个字符 。程序应测试参数的 每个 字符都是数字(参见man isdigit
)。isalpha()
不是一个好的测试。如果用户输入$
怎么办?
尚不清楚程序何时无法运行,但基于这些缺陷,这不会通过 check50。
您必须检查命令行参数中的两件事。 1. 检查你是否有 2 个参数。 (这在您的程序中未选中) 2. 检查它是否不是字母表... 因为第二个参数自动是一个字符串(由于 string argv[]),你必须先将它转换为整数。 ---- 这会产生您必须通过以下方式解决的子问题: 2.A。逐一检查字符串(每个字符),所有字符串都必须是整数。 2.B。如果至少有一个是字符,则 return false...
2.A。和 2.B。应该嵌套在一个单独的函数中,该函数将 return 一个布尔值 (T/F),然后根据该布尔值,将这两个布尔表达式包含在 while 循环中。
我的回答晚了 2 个月,但由于我刚刚解决了这个问题,我想也许有人可能遇到了我遇到的同样的困难,所以希望有人能读到这篇文章并帮助他们。 :)