Vigenere CS50 не жалуется, когда не хватает второго аргумента
Я не понимаю, почему это не работает. Он жалуется, когда есть 3 или более аргументов, но не когда есть только один аргумент Vigenere. Я смотрел на других людей, у которых была такая же проблема, и они сказали, что это помогло решить... не уверен, что мне здесь не хватает. Когда я бегу ./vigenere
Я получаю ошибку сегментации. Работает нормально с 2 arg вроде ./vigenere bard
и жалуется, когда дополнительные аргументы приводятся как ./vigenere bard dfads
,
#include <cs50.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
int main(int argc,string argv[])
{
string sKeyWord = argv[1];
int iKeyLength = strlen(sKeyWord);
int iKey[iKeyLength];
string sPlainText = "";
int counter = 0;
int iAccept = 0;
do
{
if(argc != 2) // <-----this should work whats wrong?
{
printf("Invalid argument! Please enter program name and keyword.\n");
return 1;
}
else if(argv[1])
{
for(int i = 0; i < iKeyLength; i++)
{
if (!isalpha(argv[1][i]))
{
printf("Invalid entry, please use letters only.\n");
return 1;
}
else
{
iAccept = 1;
}
}
}
}while(iAccept == 0);
for(int i = 0; i < iKeyLength; i++)
{
iKey[i] = toupper(sKeyWord[i]) - 65;
}
sPlainText = GetString();
int iPlainText = strlen(sPlainText);
for(int j = 0; j < iPlainText; j++)
{
if(!isalpha(sPlainText[j]))
{
printf("%c",sPlainText[j]);
counter++;
}
if(islower(sPlainText[j]))
{
printf("%c",((((sPlainText[j] - 97) + iKey[(j - counter)%iKeyLength])%26)+ 97));
}
if(isupper(sPlainText[j]))
{
printf("%c",((((sPlainText[j] - 65) + iKey[(j - counter)%iKeyLength])%26)+ 65));
}
}
printf("\n");
return 0;
}
1 ответ
Я бы переписал верхнюю секцию обработки аргументов вашей программы следующим образом.
int main(int argc, char **argv)
{
if (argc != 2)
{
fprintf(stderr, "Usage: %s key\n", argv[0]);
return 1;
}
char *sKeyWord = argv[1];
int iKeyLength = strlen(sKeyWord);
int iKey[iKeyLength];
for (int i = 0; i < iKeyLength; i++)
{
if (!isalpha(sKeyword[i]))
{
fprintf(stderr, "%s: Invalid character '%c' in key; please use letters only.\n",
argv[0], sKeyword[i]);
return 1;
}
iKey[i] = toupper(sKeyWord[i]) - 'A';
}
…your code to read the text to be enciphered and encipher it, etc…
Ключевым моментом является проверка того, что есть argv[1]
прежде чем пытаться что-то с этим сделать. Я устранил do { … } while (…);
цикл, потому что аргумент не собирается меняться на второй итерации. Это позволяет iAccept
Переменная должна быть исключена. Обратите внимание, что ошибки сообщаются при стандартной ошибке, а не при стандартном выводе. Также обратите внимание, что сообщениям предшествует название программы (argv[0]
). Сообщение "Использование" часто является лучшим способом сообщить о проблеме; это простое напоминание тем, кто запускает программу, что требуется. Также обратите внимание, что сообщение об ошибке для буквенной проверки сообщает об ошибочном символе; это помогает людям понять, что программа считает неправильным.
Это более или менее то, что в комментариях предлагалось сделать.
Я не проверял код шифрования; в этом тоже могут быть недиагностированные проблемы. Тем не менее, есть много связанных с SO вопросов, которые дадут вам ответы на любые такие проблемы.