cs50 Segfau 中的 Vigenere 密码

Vigenere cipher in cs50 Segfau

我没有经验coder.Please不要判断不好styling.I已经运行遇到了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 是大写还是小写, 正常编码 运行s。

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;
    }

很可能,你的意思是

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)

--- 使用查找 table 以及各种有趣的指针数学和强制转换,因此它可能允许在没有编译器抱怨的情况下传递 char *,但这绝对是不会产生好的结果。更改您的 if 语句,它应该会更好。