#c #cs50
Вопрос:
Я не вижу, чего не хватает в моем коде для замены pset2. Когда я использую check50 для тестирования программы, она возвращает этот результат:
:) substitution.c exists
:) substitution.c compiles
:( encrypts "A" as "Z" using ZYXWVUTSRQPONMLKJIHGFEDCBA as key
expected "ciphertext: Z...", not "ciphertext: Z..."
:( encrypts "a" as "z" using ZYXWVUTSRQPONMLKJIHGFEDCBA as key
expected "ciphertext: z...", not "ciphertext: z..."
:( encrypts "ABC" as "NJQ" using NJQSUYBRXMOPFTHZVAWCGILKED as key
expected "ciphertext: NJ...", not "ciphertext: NJ..."
:( encrypts "XyZ" as "KeD" using NJQSUYBRXMOPFTHZVAWCGILKED as key
expected "ciphertext: Ke...", not "ciphertext: Ke..."
:) encrypts "This is CS50" as "Cbah ah KH50" using YUKFRNLBAVMWZTEOGXHCIPJSQD as key
:) encrypts "This is CS50" as "Cbah ah KH50" using yukfrnlbavmwzteogxhcipjsqd as key
:) encrypts "This is CS50" as "Cbah ah KH50" using YUKFRNLBAVMWZteogxhcipjsqd as key
:( encrypts all alphabetic characters using DWUSXNPQKEGCZFJBTLYROHIAVM as key
expected "ciphertext: Rq...", not "ciphertext: Rq..."
:) handles lack of key
:) handles invalid key length
:) handles invalid characters in key
:) handles duplicate characters in key
:) handles multiple duplicate characters in key
мой код таков :
#include <stdio.h>
#include <cs50.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
int main(int argc, string argv[])
{
// VALIDATE THE KEY
// for argc
if (argc != 2)
{
printf("Usage: ./substitution keyn");
return 1;
}
// var n for nubers of argv
int n = 26;
// for alphabit
for (int i = 0; i < n; i )
{
if (isalpha(argv[1][i]) == 0)
{
printf("Usage: ./substitution keyn");
return 1;
}
}
// for length of argv
if (n != 26)
{
printf("Key must contain 26 characters.n");
return 1;
}
// repeated charcters
for (int i = 0; i < n; i )
{
for (int j = 0; j < n; j )
{
// step over for the character
if (i == j)
{
j = 1;
}
// error message for repeted character
if (argv[1][i] == argv[1][j])
{
printf("Key must not contain repeated characters.n");
return 1;
}
}
}
// GET PLAINTEXT
string plaintext = get_string("plaintext: ");
int npi = strlen(plaintext);
// ENCIPHER AND PRINT CIPHERTEXT
// var for ciphertext
char ci[npi];
// print ciphertext
printf("ciphertext: ");
// encipher
for (int i = 0; i < npi;)
{
for (int j = 0; j < n; j )
{
// for not alphabits
if (isalpha(plaintext[i]) == 0)
{
printf("%c", plaintext[i]);
i ;
j = 26;
}
// for upper case
if (isupper(plaintext[i]) amp;amp; ('A' j) == plaintext[i])
{
ci[i] = toupper(argv[1][j]);
printf("%c", ci[i]);
i ;
j = 0;
}
// for lower case
else if (islower(plaintext[i]) amp;amp; ('a' j) == plaintext[i])
{
ci[i] = tolower(argv[1][j]);
printf("%c", ci[i]);
i ;
j = 0;
}
}
}
printf("n");
return 0;
}
Комментарии:
1. Пожалуйста, отредактируйте свой пост, чтобы точно сказать, в чем именно заключается проблема в вашем выводе.
2. Мы не знакомы с psets CS50, пожалуйста, добавьте описание того, что должна делать программа.
3. В стороне: там, где вам следует поступить иначе, вы можете выйти за рамки.
if (i == j) { j = 1; }
if (i == j) { continue; }
4. @ryyker Я сомневаюсь, что оперативная группа знает о том, что не так, больше, чем говорит нам программа check50.
5. Возможно, вам следует разместить сообщение на CS50
Ответ №1:
Программа выводит непечатаемые символы, поэтому вывод check50 сбивает с толку, он не «печатает» их.
Попробуйте сделать это в командной строке и введите a в качестве открытого текста, чтобы увидеть результат:
./substitution ZYXWVUTSRQPONMLKJIHGFEDCBA | cat --show-nonprinting
Фундаментальным недостатком в программе является изменение значений переменных цикла в циклах ( i
и j
). В примере с открытым текстом «a» i
получает больше, чем npi
. Изложите это на бумаге.