因此,任务是将用户提示文本中的每个字符更改为给定的键。我从另一个人那里阅读了同样的问题,但没有解决方案。
以下是任务的链接:https://cs50.harvard.edu/x/2022/psets/2/substitution/
问题是,当我在我自己的终端上运行我的代码时,它会输出他们想要的正确结果,但是当我运行check50时,它失败了。
这是他们给我看的失败任务(我自己尝试时也会输出正确的结果):
:( encrypts "A" as "Z" using ZYXWVUTSRQPONMLKJIHGFEDCBA as key
expected "ciphertext: Z\...", not ""
:( encrypts "a" as "z" using ZYXWVUTSRQPONMLKJIHGFEDCBA as key
expected "ciphertext: z\...", not ""
:( encrypts "ABC" as "NJQ" using NJQSUYBRXMOPFTHZVAWCGILKED as key
expected "ciphertext: NJ...", not ""
:( encrypts "XyZ" as "KeD" using NJQSUYBRXMOPFTHZVAWCGILKED as key
expected "ciphertext: Ke...", not ""
:( encrypts "This is CS50" as "Cbah ah KH50" using YUKFRNLBAVMWZTEOGXHCIPJSQD as key
expected "ciphertext: Cb...", not ""
:( encrypts "This is CS50" as "Cbah ah KH50" using yukfrnlbavmwzteogxhcipjsqd as key
expected "ciphertext: Cb...", not ""
:( encrypts "This is CS50" as "Cbah ah KH50" using YUKFRNLBAVMWZteogxhcipjsqd as key
expected "ciphertext: Cb...", not ""
:( encrypts all alphabetic characters using DWUSXNPQKEGCZFJBTLYROHIAVM as key
expected "ciphertext: Rq...", not ""
:( does not encrypt non-alphabetical characters using DWUSXNPQKEGCZFJBTLYROHIAVM as key
expected "ciphertext: Yq...", not ""
这是我的密码
#include <cs50.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>
bool validate_command_line(int argc, string key);
string encrypt(string key, string txt);
int main(int argc, string argv[])
{
// Validate command-line arguments
if (!validate_command_line(argc, argv[1]))
{
return 1;
}
// Prompt user for a plaintext
string plaintext = get_string("plaintext: ");
// Encrypt plaintext to ciphertext using a key
string ciphertext = encrypt(argv[1], plaintext);
// Display ciphertext
printf("ciphertext: %s\n", ciphertext);
return 0;
}
// To encrypt plaintext to ciphertext by key
string encrypt(string key, string txt)
{
// Get length of a user plaintext
int l = strlen(txt);
// This will store at which index key should access
int index_letter = 0;
// To store encrypted text
char encrypted_text[l + 1];
// Iterate throught plaintext by it's length
for (int i = 0; i < l; i++)
{
// Make sure to only encrypt alphabet characters
if (isalpha(txt[i]))
{
/*
Handling lowercase character
We substract current character to ASCII Code of a, which 97
to get at index position value of the character
Ex: a is 97-97 = 0 | b is 98-97 = 1
Then use it to access at which key to access
*/
if (islower(txt[i]))
{
index_letter = txt[i] - 97;
encrypted_text[i] = tolower(key[index_letter]);
}
/* Handling uppercase character */
else
{
index_letter = txt[i] - 65;
encrypted_text[i] = toupper(key[index_letter]);
}
}
// If it's other symbol, just copying it
else
{
encrypted_text[i] = txt[i];
}
}
// Store NUL character at the end of char array
encrypted_text[l] = '\0';
// Store it to string, because we can't return char array
string ciphertext = encrypted_text;
return ciphertext;
}
// To validate command-line arguments
bool validate_command_line(int argc, string key)
{
// Validate total of command-line arguments
if (argc != 2)
{
printf("Usage: ./substitution key\n");
return false;
}
// Validate key contain 26 alphabet
int key_length = strlen(key);
if (key_length != 26)
{
printf("Key must contain 26 characters.\n");
return false;
}
// Validate key should only alphabet AND not contain repeated characters
int repeated_charaters[key_length];
int index_character = 0;
for (int i = 0; i < key_length; i++)
{
if (!isalpha(key[i]))
{
printf("Key must only contain alphabetic characters.\n");
return false;
}
index_character = tolower(key[i]) - 97;
if (repeated_charaters[index_character] == 1)
{
printf("Key must not contain repeated characters.\n");
return false;
}
repeated_charaters[index_character]++;
}
return true;
}
如string encrypt(string key, string txt)
中所示
我创建了一个返回字符串的函数,因为我想打印main()
中的文本。也许你会告诉我我不能返回字符串或字符数组。
但是我把这个函数改成了void()
,这样它就可以打印函数中的结果而不返回。
就像这样:
void encrypt(string key, string txt)
{
// Get length of a user plaintext
int l = strlen(txt);
// This will store at which index key should access
int index_letter = 0;
// To store encrypted text
char encrypted_text[l + 1];
// Iterate throught plaintext by it's length
for (int i = 0; i < l; i++)
{
// Make sure to only encrypt alphabet characters
if (isalpha(txt[i]))
{
/*
Handling lowercase character
We substract current character to ASCII Code of a, which 97
to get at index position value of the character
Ex: a is 97-97 = 0 | b is 98-97 = 1
Then use it to access at which key to access
*/
if (islower(txt[i]))
{
index_letter = txt[i] - 97;
encrypted_text[i] = tolower(key[index_letter]);
}
/* Handling uppercase character */
else
{
index_letter = txt[i] - 65;
encrypted_text[i] = toupper(key[index_letter]);
}
}
// If it's other symbol, just copying it
else
{
encrypted_text[i] = txt[i];
}
}
// Store NUL character at the end of char array
encrypted_text[l] = '\0';
printf("%s", encrypted_text);
}
我对编程很陌生,希望你们能给予我解决方案,谢谢。
2条答案
按热度按时间py49o6xq1#
我的理解是
string
就是cs50中的char *
。无效,因为encrypted_text是将在函数结尾销毁的局部数组。不能返回指向局部数组的指针
nwlqm0z12#
问题是数组
repeated_charaters
没有初始化。本地系统与check50系统的区别在于“未初始化”内存中的内容。在声明之后将所有array_elements设置为0以解决问题(在“This is my code”之后粘贴的代码中)