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 вопросов, которые дадут вам ответы на любые такие проблемы.

Другие вопросы по тегам