有人可以帮助我解决我的代码吗?我已经搜索了答案,但与我的代码有些不同。
#include<stdio.h>
#include<cs50.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
int main(int argc,string argv[])
{
for (int k = 0;k<strlen(argv[1]);k++)
{
if (isalpha(argv[1][k]))
{}
else
{
return EXIT_FAILURE;
}
}
if (argc == 2)
{
int alpha,cipher,key,j=0,len=strlen(argv[1]);
char a;
string plaintext = get_string("Text: ");
printf("ciphertext: ");
for (int i = 0; i<strlen(plaintext) ; i++)
{
if (isalpha(plaintext[i]))
{
if (isupper(plaintext[i]))
{
alpha = plaintext[i]-65;
key = argv[1][j]-65;
cipher = (key+alpha)%26;
a = (char) cipher+65;
printf("%c",a);
j=(j+1)%len;
}
else if (islower(plaintext[i]))
{
alpha = plaintext[i]-97;
key = argv[1][j]-97;
cipher = (key+alpha)%26;
a = (char) cipher+97;
printf("%c",a);
j=(j+1)%len;
}
}
else
{
printf("%c",plaintext[i]);
}
}
printf("\n");
}
else
{
printf("error\n");
return EXIT_FAILURE;
}
}
答案 0 :(得分:0)
您的代码可以正确处理纯文本中的大写和小写字母,但不能正确处理关键字中的不同大小写字母。处理大写的纯文本字母时,即使关键词可能不是大写,也要从关键词中减去65
。
您只需将所有关键字字母转换为普通字母,然后从中减去相应的第一个字母即可得到增加的数量。
也不需要检查islower()
-如果不是大写字母,则必须是小写字母。因此,只需使用else
。
if (isupper(plaintext[i]))
{
alpha = plaintext[i]-'A';
key = toupper(argv[1][j])-'A';
cipher = (key+alpha)%26;
a = (char) cipher+'A';
printf("%c",a);
j=(j+1)%len;
}
else
{
alpha = plaintext[i]-'a';
key = toupper(argv[1][j])-'A';
cipher = (key+alpha)%26;
a = (char) cipher+'a';
printf("%c",a);
j=(j+1)%len;
}
要解决由于缺少argv[1]
而引起的细分错误,请移动循环,以检查关键字在if (argc == 2)
块内是否全部为字母。然后,您还可以使用len
变量,而不是在循环中重复strlen(argv[1])
。