Vigenere cs50 не жалуется, когда не хватает второго arg

Я не понимаю, почему это не работает. Он жалуется, когда есть 3 или более ARG, но не когда есть только один vigenere arg. Я посмотрел на других людей, у которых была та же проблема, и они сказали, что это работает, чтобы решить…..не уверен, что я упускаю здесь. Когда я бегу./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 ответ

  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]). Сообщение об использовании часто является лучшим способом сообщить о проблеме; это простое напоминание тем, кто запускает программу, что требуется. Обратите внимание также, что сообщение об ошибке для проверки алфавита сообщает об ошибочном символе; это помогает людям увидеть, что программа думает неправильно.

    Это более или менее то, что предлагалось сделать в комментариях.

    Я не рассматривал код шифрования; в этом тоже могут быть недиагностированные проблемы. Есть много связанных вопросов на так, что бы предоставить вам ответы на любые такие проблемы, хотя.