我们现在正在与vigenere的caesar合作。我勉强完成了凯撒大战,但维吉内尔表现不佳。 C给了我:二进制表达式(“ int *”和“ int”)的无效操作数。我不确定程序的确切含义以及我的代码有什么问题。有人可以帮助我还是给我建议?我认为这是因为我无法使用不同类型的数字进行计数吗?我不确定!
#include <cs50.h>
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, string argv[])
{
if (argc != 2)
{
printf("You have to input a key, try again!\n");
return 1;
}
string key = argv[1];
int keylength = strlen(key);
for (int i = 0; i < keylength; i++)
{
if (!isalpha(argv[1][i]))
{
printf("Please insert letters, nothing else\n");
return 1;
}
}
printf("plaintext: ");
string plain = get_string();
int keycipher[keylength];
for(int i = 0; i < keylength; i++)
{
keycipher[i] = toupper(key[i]) - 65;
}
if (plain != 0)
{
printf("ciphertext: ");
int i;
for (i = 0, keylength = strlen(key); i < keylength; i++)
{
if (isupper(plain[i]))
{
printf("%c", (plain[i] - 65 + keycipher) % 26);
}
else if (islower(plain[i]))
{
printf("%c", (plain[i] - 97 + keycipher) % 26);
}
else if (plain[i] == ' ')
{
printf(" ");
}
else
{
printf("%c", plain[i]);
}
}
}
return 0;
}
最佳答案
如注释中所述,您必须使用+ keycipher[index]
而不是+ keycipher
。这是因为keycipher
是一个数组,您一次只需要使用数组的一个元素。
此外,您将需要2个计数器变量,而不是找到ciphertext
的部分中的一个。这是因为您需要在每次迭代中增加plaintext
索引和key
索引,但是一旦plaintext
长度超过key
长度,就需要重置密钥索引。
如果检查规格,您将理解我在使用2个计数器时的意思。