#include <stdio.h>
#include <cs50.h> //stdlib.h is included in cs50.h so I don't need it
#include <string.h>
#include <ctype.h>
#include <math.h>
int main(int argc, string argv[]) // command line input
{
if(argc != 2) // check if there is only one input
{
printf("error\n");
return 1;
}
int commandlength = strlen(argv[1]); // find string length of command string
string key[commandlength + 1]; // taking the key from the input and putting it in something that will take less typing later
for(int i = 0; i < commandlength; i++) // check if every char in the string is a letter
{
if(isalpha(argv[1][i]))
continue;
else
{
printf("error\n");
return 1;
}
}
strcpy(key[commandlength], argv[1]); // copy key from command line into a string called key
string input = GetString();
int inputlength = strlen(input); // length of string typed in when prompted
int k = 0; // this will be used to iterate the key separately from i, since the key only iterates when applied to an alpha
for(int i = 0; i < inputlength; i++)
{
if(ispunct(input[i]))
printf("%c", input[i]);
if(isspace(input[i]))
printf("%c", input[i]);
if(isupper(input[i]))
{
printf("%c", (input[i] + atoi(key[k]) % commandlength - 65) % 26 + 65);
k++;
}
if(islower(input[i]))
{
printf("%c", (input[i] + atoi(key[k]) % commandlength - 97) % 26 + 97);
k++;
}
}
printf("\n");
return 0;
}
Перед тем, как читать, имейте в виду, что я студент. Гораздо выгоднее получить подробное объяснение, чем просто строку кода, в которой говорится: «Здесь вы идете, я ее исправил». Я буду связывать этот пост в своем представлении, и у нас есть очень строгие правила об академической целостности, а также то, что копирует и помогает, и я бы очень признателен, если бы это было учтено.Я понятия не имею, почему я получаю ошибки ошибки сегментации
Целью этого проекта является создание шифрования vigenere. Ниже приведены инструкции, которые преподал мой преподаватель:
Ваша последняя задача на этой неделе - написать в vigenere.c программу, которая шифрует сообщения с помощью шифрования Vigenère. Эта программа должна принимать один аргумент командной строки: ключевое слово k, составленное полностью из алфавитных символов. Если ваша программа выполняется без аргументов командной строки, с несколькими аргументами из командной строки или с одним аргументом командной строки, который содержит любой алфавитный символ, ваша программа должна жаловаться и немедленно уходить с возвратом 1 (тем самым означающее ошибку, которую могут обнаружить наши собственные тесты). В противном случае ваша программа должна перейти к приглашению пользователя для строки открытого текста p, которую она затем должна зашифровать в соответствии с шифрованием Vigenère с k, в конечном итоге распечатать результат и выйти с основным возвратом 0.
Что касается символов в k вы должны обрабатывать A и a как 0, B и b как 1, ... и Z и z как 25. Кроме того, ваша программа должна применять только шифр Vigenère к символу в p, если этот символ является буквой. Все остальные символы (цифры, символы, пробелы, знаки препинания и т. Д.) Должны выводиться без изменений. Более того, если ваш код собирается применить j-й символ k к i-му символу p, но последний окажется не алфавитным символом, вы должны подождать, чтобы применить этот j-й символ k к следующему алфавитному символу в p ; вы еще не должны перейти к следующему символу в k. Наконец, ваша программа должна сохранять случай каждой буквы в p.
Я уверен, что я применил требования для итерации кода, убедившись, что ключевые петли, если она короче, чем зашифрованная фраза, и убедитесь, что я не применяю ключ к не-альфа-символам. Тем не менее, я получаю деление по сегментам, прежде чем предлагать ввести строку для шифрования, поэтому я уверен, что проблема кроется в верхней половине кода. Я просмотрел код совсем немного, и я до сих пор не могу понять, почему он продолжает сталкиваться.
Вы пробовали отлаживать? – user1336087
Я не знаю, как это сделать; однако я знаю, что он успешно блокирует пароли с неалфавитными символами и блокирует входы, которые либо не имеют ключа (т. е. argc == 1 в этом сценарии), либо имеют более одного (argc> 2). Я также знаю это segfaults, прежде чем запрашивать строку для шифрования, поэтому это заставляет меня думать, что проблема лежит между ними. – iced
Скомпилируйте все предупреждения и отладочную информацию 'gcc -Wall -g', затем ** используйте отладчик ** (' gdb'). –