cs50 pset2凯撒,出现分段错误或转换不兼容

时间:2020-08-06 02:54:34

标签: c cs50

到目前为止,这是我针对caesar problem from problem set 2 of CS50的代码:

int main(int argc, string argv[])
{
    if (argc == 2 && check_integer(argv[1]) == true)
    {
        int key = atoi(argv[1]);
        string plaintext = get_string("plaintext: ");
        string ciphertext[strlen(plaintext)];
        for (int i = 0, n = strlen(plaintext); i < n; i++)
        {
            char a = plaintext[i], b;
            if (a >= 'A' && a <= 'Z')
            {
                if (a + (key % 26) > 'Z')
                {
                    b = a - (26 - (key % 26));
                }
                else
                {
                    b = a + (key % 26);
                }
            }
            if ((a >= 'a' && a <= 'z'))
            {
                if (a + (key % 26) > 'z')
                {
                    b = a - (26 - (key % 26));
                }
                else
                {
                    b = a + (key % 26);
                }
            }
            ciphertext[i] = b;
        }
        printf("ciphertext: %s", ciphertext);
        return 0;
    }
    else
    {
        printf("Usage: ./caesar key\n");
        return 1;
    }
}

有问题的部分仅是密文字符串。使用此当前代码,它表示从char b到字符串chiphertext [i]的转换不兼容。因此,我尝试在初始化时删除数组,并将其初始化为NULL,但随后出现分段错误。还有另一个错误,它说它不能打印密文,因为格式表明它是我放置字符串据点时的字符。我该怎么办?

这里是a picture of the error

1 个答案:

答案 0 :(得分:2)

由于stringtypedef的{​​{1}},所以char*ciphertext指针的数组。因此,在期望指针将产生不良结果的情况下分配char

您真的不希望charciphertext的数组。您希望它是另一个与string大小相同的字符串。您可以使用

plaintext

此外,我将两次计算string ciphertext=malloc(strlen(plaintext)+1); // The +1 is for the null-terminator. 。做

strlen(plaintext)