我正在经历CS50,我被卡在pset2凯撒上。我按照说明进行了逐步操作,并且跳过了验证密钥的部分-确保命令行参数只是一个数字(./caesar 20),如果不是(./caesar 20x或./caesar xyz)以打印出用法:./ caesar键\ 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;
}
答案 0 :(得分:1)
您需要重新进行输入验证。
argv[1]
的第一个字符。程序应测试参数的每个字符是否为数字(请参见man isdigit
)。 isalpha()
不是一个很好的测试。如果用户输入$
怎么办?尚不清楚程序何时无法运行,但是基于这些缺陷,这将无法通过check50。
答案 1 :(得分:0)
您必须在命令行参数中检查2件事。 1.检查是否有2个参数。 (未在您的程序中选中) 2.检查它是否不是字母...由于第二个参数自动为字符串(由于字符串argv []),因此必须首先将其转换为整数。 ----这会滋生您必须注意的子问题: 2.A.逐一检查字符串(每个字符),并且所有字符串必须为整数。 2.B.如果至少一个字符是字符,则返回false ...
2.A。和2.B.应该嵌套在一个单独的函数中,该函数将返回一个布尔值(T / F),然后从该布尔值中将这两个布尔表达式括在while循环中。
我的回答迟了两个月,但自从我完成这个问题以来,我认为也许有人可能遇到与我同样的困难,因此希望有人可以阅读并帮助他们。 :)