cs50 Segfau中的Vigenere密码

时间:2017-03-14 01:43:20

标签: c cs50 vigenere

我不是经验丰富的编码员。请不要判断造型不好。我遇到了vingenere密码的问题 它一直给我segfau

#include <stdio.h>
#include <cs50.h>
#include <ctype.h>
#include <stdlib.h>
#include <string.h>**

int main(int argc,string argv[])
    {
       while (argc!=2)
       {
        printf("Incorrect input\n");
        return 1;
       }

    printf("plaintext:");
    string plaintext=get_string();

    string num=argv[1];
    int keylength=strlen(num);

    for (int j=0, n=strlen(plaintext); j<n; j++)
    {
        char letter=plaintext[j];
        if (isalpha(letter))
        {

这是Segmantation Fault错误的原因。 如果我不检查num是大写还是小写, 代码正常运行。

if (isupper(letter))
            {
                if (isupper(num))
                {
                    printf ("%c",((((letter-65)+(num[j%keylength]-65))%26)+65));
                }
                else
                {
                    printf ("%c",((((letter-65)+(num[j%keylength]-97))%26)+65));
                }
             }
            else
            {
                if (isupper(num))
                {
                    printf ("%c",((((letter-97)+(num[j%keylength]-65))%26)+97));
                }

               else
              {
                   printf ("%c",((((letter-97)+(num[j%keylength]-97))%26)+97));
               }
           }
        }
        else
        {
            printf ("%c",letter);
        }
    }
    printf("\n");
    return 0;
    }

1 个答案:

答案 0 :(得分:0)

最有可能的意思是

if (isupper(num[j % keylength))

将字符串(实际为char *)传递给isupper()是一种未定义的操作,可能会产生奇怪的效果,具体取决于isupper()的实现方式。 GNU实现---

#define __ctype_lookup(__c) ((__ctype_ptr__+sizeof(""[__c]))[(int)(__c)])
#define isupper(__c) ((__ctype_lookup(__c)&(_U|_L))==_U)

---使用一个带有各种有趣的指针数学和转换的查找表,所以它可能允许在没有编译器抱怨的情况下传递char *,但它肯定不会去产生好的结果。更改您的if声明,它应该会更好。