我的 Cs50 凯撒密码程序可以运行,但无法通过 check50 测试
My Cs50 Caesar cipher program works but it won't pass the check50 tests
我的程序在我自己测试时运行正常,预期输出与 check50 测试中的实际输出相匹配。然而,我仍然未能通过大部分测试。
这是我的代码:
#include <cs50.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
string get_plain(void);
int main(int argc, string argv[])
{
//checks to see if only one argument is inputted.
if (argc != 2)
{
printf("Usage: ./caesar key\n");
return 1;
}
//Checks to see if the argument is an integer.
int key = atoi(argv[1]);
if (key == 0)
{
printf("Usage: ./caesar key\n");
return 1;
}
//Grabs plaintext input off user
string plaintext = get_plain();
int j = strlen(plaintext);
//creates an array the size of the user string input.
char ciphar[j];
printf("ciphertext: ");
for (int i = 0; i <= j; i++)
{
//Checks to see if the input is uppercase.
if (plaintext[i] >= 'A' && plaintext[i] <= 'Z')
{
//Checks if the input and the key added do not exceed ascii limits on uppercase letters.
if (plaintext[i] + (key % 26) > 90)
{
ciphar[i] = plaintext[i] + (key % 26) - 26;
printf("%c", ciphar[i]);
}
else
{
ciphar[i] = plaintext[i] + (key % 26);
printf("%c", ciphar[i]);
}
}
//Checks to see if the input is uppercase.
else if (plaintext[i] >= 'a' && plaintext[i] <= 'z')
{
//Checks if the input and the key added do not exceed ascii limits on lowercase letters.
if (plaintext[i] + (key % 26) > 122)
{
ciphar[i] = plaintext[i] + (key % 26) - 26;
printf("%c", ciphar[i]);
}
else
{
ciphar[i] = plaintext[i] + (key % 26);
printf("%c", ciphar[i]);
}
}
else
{
printf("%c", plaintext[i]);
}
}
printf("\n");
return 0;
}
//Grabs plaintext input off user
string get_plain(void)
{
string plaintext = get_string("Plaintext: ");
return plaintext;
}
这是我从 Check50 收到的输出
Results for cs50/problems/2020/x/caesar generated by check50 v3.0.10
:) caesar.c exists.
:) caesar.c compiles.
:( encrypts "a" as "b" using 1 as key
expected "ciphertext: b\...", not "ciphertext: b\..."
:( encrypts "barfoo" as "yxocll" using 23 as key
expected "ciphertext: yx...", not "ciphertext: yx..."
:( encrypts "BARFOO" as "EDUIRR" using 3 as key
expected "ciphertext: ED...", not "ciphertext: ED..."
:( encrypts "BaRFoo" as "FeVJss" using 4 as key
expected "ciphertext: Fe...", not "ciphertext: Fe..."
:( encrypts "barfoo" as "onesbb" using 65 as key
expected "ciphertext: on...", not "ciphertext: on..."
:( encrypts "world, say hello!" as "iadxp, emk tqxxa!" using 12 as key
expected "ciphertext: ia...", not "ciphertext: ia..."
:) handles lack of key
:( handles non-numeric key
timed out while waiting for program to exit
:) handles too many arguments
如您所见,预期输出和实际输出相同。然而,测试仍然失败。
如果有人能告诉我该怎么做,我将不胜感激。我仍在学习,所以对我的代码的任何批评与我的问题相关和不相关也将不胜感激。
预期输出和实际输出仅看起来与人类相同。它们是不同的,并且差异是人眼无法察觉的。
它正在打印来自纯文本的终止空字节,这是不可打印的,所以您看不到它。问题出在这里for (int i = 0; i <= j; i++)
.
我的程序在我自己测试时运行正常,预期输出与 check50 测试中的实际输出相匹配。然而,我仍然未能通过大部分测试。
这是我的代码:
#include <cs50.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
string get_plain(void);
int main(int argc, string argv[])
{
//checks to see if only one argument is inputted.
if (argc != 2)
{
printf("Usage: ./caesar key\n");
return 1;
}
//Checks to see if the argument is an integer.
int key = atoi(argv[1]);
if (key == 0)
{
printf("Usage: ./caesar key\n");
return 1;
}
//Grabs plaintext input off user
string plaintext = get_plain();
int j = strlen(plaintext);
//creates an array the size of the user string input.
char ciphar[j];
printf("ciphertext: ");
for (int i = 0; i <= j; i++)
{
//Checks to see if the input is uppercase.
if (plaintext[i] >= 'A' && plaintext[i] <= 'Z')
{
//Checks if the input and the key added do not exceed ascii limits on uppercase letters.
if (plaintext[i] + (key % 26) > 90)
{
ciphar[i] = plaintext[i] + (key % 26) - 26;
printf("%c", ciphar[i]);
}
else
{
ciphar[i] = plaintext[i] + (key % 26);
printf("%c", ciphar[i]);
}
}
//Checks to see if the input is uppercase.
else if (plaintext[i] >= 'a' && plaintext[i] <= 'z')
{
//Checks if the input and the key added do not exceed ascii limits on lowercase letters.
if (plaintext[i] + (key % 26) > 122)
{
ciphar[i] = plaintext[i] + (key % 26) - 26;
printf("%c", ciphar[i]);
}
else
{
ciphar[i] = plaintext[i] + (key % 26);
printf("%c", ciphar[i]);
}
}
else
{
printf("%c", plaintext[i]);
}
}
printf("\n");
return 0;
}
//Grabs plaintext input off user
string get_plain(void)
{
string plaintext = get_string("Plaintext: ");
return plaintext;
}
这是我从 Check50 收到的输出
Results for cs50/problems/2020/x/caesar generated by check50 v3.0.10
:) caesar.c exists.
:) caesar.c compiles.
:( encrypts "a" as "b" using 1 as key
expected "ciphertext: b\...", not "ciphertext: b\..."
:( encrypts "barfoo" as "yxocll" using 23 as key
expected "ciphertext: yx...", not "ciphertext: yx..."
:( encrypts "BARFOO" as "EDUIRR" using 3 as key
expected "ciphertext: ED...", not "ciphertext: ED..."
:( encrypts "BaRFoo" as "FeVJss" using 4 as key
expected "ciphertext: Fe...", not "ciphertext: Fe..."
:( encrypts "barfoo" as "onesbb" using 65 as key
expected "ciphertext: on...", not "ciphertext: on..."
:( encrypts "world, say hello!" as "iadxp, emk tqxxa!" using 12 as key
expected "ciphertext: ia...", not "ciphertext: ia..."
:) handles lack of key
:( handles non-numeric key
timed out while waiting for program to exit
:) handles too many arguments
如您所见,预期输出和实际输出相同。然而,测试仍然失败。
如果有人能告诉我该怎么做,我将不胜感激。我仍在学习,所以对我的代码的任何批评与我的问题相关和不相关也将不胜感激。
预期输出和实际输出仅看起来与人类相同。它们是不同的,并且差异是人眼无法察觉的。
它正在打印来自纯文本的终止空字节,这是不可打印的,所以您看不到它。问题出在这里for (int i = 0; i <= j; i++)
.