当缺乏第二次争论时,Vigenere cs50并没有抱怨

时间:2016-05-01 01:28:01

标签: c vigenere cs50

我不明白为什么它不起作用。当有3个或更多的args时它会抱怨,但是当只有一个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 个答案:

答案 0 :(得分:0)

我会像这样重写程序的top,argument handling部分。

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的许多相关问题可以为您提供任何此类问题的答案。