Vigenere 测试失败 :( 使用 "BaZ" 作为关键字将 "BaRFoo" 加密为 "CaQGon"
Vigenere failed test :( encrypts "BaRFoo" as "CaQGon" using "BaZ" as keyword
有人可以用我的代码帮助我解决上面的这个错误吗?我搜索了答案,但它们与我的代码有点不同。
- vigenere.c编译。
- 使用"a"作为关键字
将"a"加密为"a"
- 使用 "baz" 作为关键字
将 "barfoo" 加密为 "caqgon"
- 使用 "BaZ" 作为关键字将 "BaRFoo" 加密为 "CaQGon"
失败 预期 "ciphertext: CaQ...",而不是 "ciphertext: CaQ..."
- 使用 "BAZ" 作为关键字将 "BARFOO" 加密为 "CAQGON"
- 使用"baz"作为关键字
将"world!$?"加密为"xoqmd!$?"
- 使用"baz"作为关键字
将"hello, world!"加密为"iekmo, vprke!"
- 处理缺少 argv[1]
失败由于分段错误未能执行程序
- 处理 argc > 2
- 拒绝 "Hax0r2" 作为关键字
#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;
}
}
您的代码正确处理了明文中的大小写字母,但没有正确处理关键字中的不同大小写字母。当您处理大写明文字母时,您从关键字字母中减去 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])
。
有人可以用我的代码帮助我解决上面的这个错误吗?我搜索了答案,但它们与我的代码有点不同。
- vigenere.c编译。
- 使用"a"作为关键字 将"a"加密为"a"
- 使用 "baz" 作为关键字 将 "barfoo" 加密为 "caqgon"
- 使用 "BaZ" 作为关键字将 "BaRFoo" 加密为 "CaQGon"
失败 预期 "ciphertext: CaQ...",而不是 "ciphertext: CaQ..." - 使用 "BAZ" 作为关键字将 "BARFOO" 加密为 "CAQGON"
- 使用"baz"作为关键字 将"world!$?"加密为"xoqmd!$?"
- 使用"baz"作为关键字 将"hello, world!"加密为"iekmo, vprke!"
- 处理缺少 argv[1]
失败由于分段错误未能执行程序 - 处理 argc > 2
- 拒绝 "Hax0r2" 作为关键字
#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;
}
}
您的代码正确处理了明文中的大小写字母,但没有正确处理关键字中的不同大小写字母。当您处理大写明文字母时,您从关键字字母中减去 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])
。