gpt4 book ai didi

CS50 Vigenere - 输出不正确

转载 作者:行者123 更新时间:2023-11-30 17:02:17 28 4
gpt4 key购买 nike

伙计,我以为我已经拥有了!我一直在研究 Vigenere 问题并且已经接近了,但是当我检查时不断收到此错误。当 key 必须循环回来时,看起来好像有问题。想法?

这是错误:

:) vigenere.c exists

:) vigenere.c compiles

:) encrypts "a" as "a" using "a" as keyword :( encrypts "world, say hello!" as "xoqmd, rby gflkp!" using "baz" as keyword \ expected output, but not "xoqmj, yfz gflkp!\n"

:( encrypts "BaRFoo" as "CaQGon" using "BaZ" as keyword \ expected output, but not "CaQAun\n"

:( encrypts "BARFOO" as "CAQGON" using "BAZ" as keyword \ expected output, but not "CAQAON\n"

:) handles lack of argv[1]

:) handles argc > 2

:) rejects "Hax0r2" as keyword

这是我的代码:

#include <stdio.h>
#include <cs50.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>

#define FALSE 0
#define TRUE 1

int main(int argc, string argv[])
{
string key = argv[1];

if (argc!= 2)
{
printf("please provide only one perameter \n");

// stop the program
return 1;
}

// iterate over the key to make sure its all alpha
int i,j;
for (i = 0, j = strlen(key); i < j; i++)
{
if (!isalpha(key[i]))
{
printf("please use only alphanumeric values \n");
return 1;
}
}

// now we have a key, "key" from the ONE perameter that is all alpha

string message = GetString();
int k = 0;
int keyindex;

for (i = 0, j = strlen(message); i < j; i++, k++)
{
if (isalpha(message[i]))
{
keyindex = k % strlen(argv[1]);
// covering the upper case letters
if (isupper(message[i]))
{
// covering the upper case letters with upper case key letters

if isupper(key[i])
{
// print cipher according to two upper case
int cipher = ((message[i] - 65 + key[keyindex] - 65) % 26)
+ 65;
printf("%c", cipher);
}
else
{
// print according to upper case message lower case key
int cipher = ((message[i] - 65 + key[keyindex] - 97) % 26)
+ 65;
printf("%c", cipher);
}
}
// this is for the non upper case letters
if (islower(message[i]))
{
if isupper(key[i])
{
// print cipher according to lower case message and
// upper case key letter
int cipher = ((message[i] - 97 + key[keyindex] - 65) % 26)
+ 97;
printf("%c", cipher);
}
else
{
// print according to lower case message and lower case key
int cipher = ((message[i] - 97 + key[keyindex] - 97) % 26)
+ 97;
printf("%c", cipher);
}
}

}
// non alpha symbols
else
{
printf("%c", message[i]);
}
}

// end program after iterating
printf("\n");

}

最佳答案

您的程序存在问题:

1) 语法错误导致其无法编译:

if isupper(key[i]) -> if (isupper(key[i]))

有两个问题,因此请务必修复它们。

2) 递增k

int k = 0;
...
for (i = 0, j = strlen(message); i < j; i++, k++)
{
if (isalpha(message[i]))
{
keyindex = k % strlen(argv[1]);

有两种方法可以解决这个问题,要么在每个字符上增加k,要么在每个字母上增加k 。这个问题的设计者选择了字母,所以我们需要这样做:

int k = 0;
...
for (i = 0, j = strlen(message); i < j; i++)
{
if (isalpha(message[i]))
{
keyindex = k++ % strlen(argv[1]);

3)既然我们已经定义了keyindex,请使用它:

if isupper(key[i]) -> if isupper(key[keyindex])

有两个问题,因此请务必修复它们。

应用这些更改和一些样式清理,我们得到:

#include <stdio.h>
#include <cs50.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>

int main(int argc, string argv[])
{
if (argc != 2)
{
printf("please provide only one parameter \n");

return 1; // stop the program
}

string key = argv[1];

// iterate over the key to make sure it's all alpha

for (int i = 0, j = strlen(key); i < j; i++)
{
if (!isalpha(key[i]))
{
printf("please use only alphanumeric values \n");

return 1;
}
}

// now we have a key, "key" from the ONE parameter that is all alpha

string message = GetString();

for (int i = 0, k = 0, j = strlen(message); i < j; i++)
{
if (isalpha(message[i]))
{
int keyindex = k++ % strlen(key);

if (isupper(message[i])) // covering the upper case letters
{
if (isupper(key[keyindex]))
{
// print cipher according to both upper case
int cipher = ((message[i] - 'A' + key[keyindex] - 'A') % 26) + 'A';
printf("%c", cipher);
}
else
{
// print cipher according to upper case message and lower case key
int cipher = ((message[i] - 'A' + key[keyindex] - 'a') % 26) + 'A';
printf("%c", cipher);
}
}
else // this is for the non upper case letters
{
if (isupper(key[keyindex]))
{
// print cipher according to lower case message and upper case key letter
int cipher = ((message[i] - 'a' + key[keyindex] - 'A') % 26) + 'a';
printf("%c", cipher);
}
else
{
// print cipher according to both lower case
int cipher = ((message[i] - 'a' + key[keyindex] - 'a') % 26) + 'a';
printf("%c", cipher);
}
}

}
else // non alpha symbols
{
printf("%c", message[i]);
}
}

printf("\n"); // end program after iterating

}

您的代码重复了很多逻辑,您可以将这些逻辑与较小的更改结合起来 - 重复的逻辑是很难发现错误渗入代码的一种方式。

关于CS50 Vigenere - 输出不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36612742/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com