Следующий код изменяет буквы ввода на k.К является первым аргументом.Например, если ввод должен быть изменен на 2 буквы, аргумент командной строки будет «./caesar 2», если три, то «./caesar 3».и т. д. Изменение букв означает, например, изменение на 2, затем ввод «а» становится «с».Изменение на 3 означает, что ввод «abc» становится «def» и т. Д. Входные данные, предоставляемые пользователем, проверяются, если (а) число аргументов является точным 2, (б) аргумент является числом.
Код, выполняемый как код, записывается под выводом, сокращается на одну букву.Например, «привет», измененный на 1 букву, становится «iffm».Если введена только одна буква, она показывает правильный вывод с некоторыми неопределенными буквами.Например, «a» становится «b��P» или «bm> �» или «b; ���».
Когда либо (1) проверка входных данных (b) [если аргументчисло] удаляется ИЛИ (2) строка printf со случайным оператором (это может быть даже пустая строка) вставляется ТОЧНО между функцией get_string, когда пользователь запрашивает ввод, и циклом for, когда меняются буквывывод как и предполагалось.Или (3) если последний символ ввода является специальным символом, результат будет таким, как ожидалось (специальный символ - любой не алфавитный символ).например, "привет1" или "привет!"изменение на одну букву становится «ifmmp1» или «ifmmp!».
Я действительно в отчаянии и не знаю, что происходит, и, что более важно, почему это происходит.Итак, мои вопросы: (1) Почему вывод сокращен на одну букву?Почему вывод неправильный, если ввод только одна буква?(Я думаю, это та же проблема).(2) (a) Почему выходные данные изменяются, когда либо убрана проверка номера, либо (b) случайная строка printf вставлена точно между строками, упомянутыми выше, или (c) последний символ является не алфавитным символом?
Я очень ценю любую помощь и прошу прощения за любой странный английский, поскольку это не мой родной язык :).Большое спасибо!Ученик отчаянного кода:)
Это код:
#include <cs50.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
bool isNumber(string numberToCheck);
int main(int argc, string argv[])
{
// checking, if arguments are correct
// checking, if input is correct (i.e. 2)
if(argc != 2)
{
printf("Usage: ./cesar key\n");
exit(1);
}
// checking, if input is a number, if the following if statement is removed the output changes
if(!isNumber(argv[1]))
{
printf("Usage: ./caesar key\n");
exit(1);
}
// variables
int k = atoi(argv[1]);
string plaintext;
int plaintextLength;
// getting the plaintext from user input, creating ciphertext string of same length
plaintext = get_string("paintext: ");
// checking the length of the input
plaintextLength = strlen(plaintext);
//the output changes, when the next line is being inserted
printf("");
// creating new empty string with plaintextLength
char ciphertext[plaintextLength];
// iterating through plaintext char by char
for(int i = 0; i < plaintextLength;i++)
{
// in case of capital letter
if(plaintext[i] >= 65 && plaintext[i] <= 90)
{
ciphertext[i] = 65 + (((plaintext[i] - 65) + k) % 26);
}
// else in case of small letter
else if(plaintext[i] >= 97 && plaintext[i] <= 122)
{
ciphertext[i] = 97 + (((plaintext[i] - 97) + k) % 26);
}
// else in case of non alphabetical letter
else
{
ciphertext[i] = plaintext[i];
}
}
printf("ciphertext: %s\n", ciphertext);
}
bool isNumber(string numberToCheck)
{
for(int i = 0;i < strlen(numberToCheck); i++)
{
if(!isdigit(numberToCheck[i]))
{
return false;
}
}
return true;
}