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

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

person Firecore    schedule 01.05.2016    source источник
comment
Вы должны исследовать в более раннем. Например, до string sKeyWord = argv[1];   -  person BLUEPIXY    schedule 01.05.2016
comment
ДОХ! спасибо bluepixy High Five мой спаситель! заменено на строку skeyWord = ; а затем присвоил ему argv[1] в конце цикла do while.   -  person Firecore    schedule 01.05.2016
comment
Почему вы проверяете аргументы в цикле do-while? (Подсказка: я думаю, вам не нужно, чтобы этот код был в цикле.)   -  person luser droog    schedule 01.05.2016
comment
Почему? Потому что я нуб, лол. Рассмотрю это. Переместив некоторые вещи, я нарушил процесс шифрования. Вечером постараюсь отладить сам.   -  person Firecore    schedule 01.05.2016
comment
@luser droog хорошо, я обновил свой OP до кода, который у меня есть сейчас. все работает, за исключением случаев, когда в ключевом слове используется «z». он неправильно сдвигает открытый текст. все остальные буквы вроде работают нормально. вот мой чек50   -  person Firecore    schedule 01.05.2016
comment
Не переделывайте вопрос так, чтобы он имел так мало отношения к оригиналу (хотя я полагаю, что, поскольку у вас нет формального ответа, может быть, исправление должно быть разрешено — но в целом не трансформируйте вопрос так, чтобы предыдущий помощь уже не актуальна). При необходимости покажите исправленную версию кода (а также оригинал). Вы также должны показать примерные входные данные, ожидаемые результаты и фактические результаты. Ваш код «проверьте, все символы в ключе являются буквенными» показался мне сомнительным. Вычитание 65, а не 'A' проблематично, хотя может быть и не-EBCDIC.   -  person Jonathan Leffler    schedule 02.05.2016
comment
@Firecore Создайте новый вопрос для новой проблемы исправленного кода.   -  person luser droog    schedule 02.05.2016
comment
Почему предполагается, что люди знают, что вы имеете в виду под cs50? Это не стандартный заголовок. Кажется, что-то, что используется в некоторых курсах бакалавриата CS.   -  person John Coleman    schedule 02.05.2016
comment
Извиняюсь, новичок в программировании, переполнении стека и cs в целом. Спасибо за совет. Сделаю новый вопрос.   -  person Firecore    schedule 02.05.2016


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

person Jonathan Leffler    schedule 08.08.2016