分段错误(核心已转储),不知道为什么?

Segmentation fault (core dumped), cant figure why?

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

int main(void)
{
    string cipher = "qwertyuiopasdfghjklzxcvbnm";
    string plaintext = "Hello World!";
    string ciphertext = "ciphertext: ";
    for(int j = 0; j < strlen(plaintext); j++)
    {
        if(isupper(plaintext[j]))
        {
            int k = plaintext[j] - 65;
            char append = toupper(cipher[k]);
            strncat(ciphertext, &append, 1);
        }
        else if(islower(plaintext[j]))
        {
            int l = plaintext[j] - 65;
            char append2 = tolower(cipher[l]);
            strncat(ciphertext, &append2, 1);
        }
        else
        {
            char append3 = plaintext[j];
            strncat(ciphertext, &append3, 1);
        }
    }
    printf("%s", ciphertext);
}

当 运行 以上错误来自于尝试连接密文并追加。据我所知,尝试写入无效内存位置时出现错误,我不明白这是如何调用无效内存位置的?

您声明了一个指向字符串文字的指针

string ciphertext = "ciphertext: ";

然后您尝试更改字符串文字

strncat(ciphertext, &append, 1);

任何更改字符串文字的尝试都会导致未定义的行为。

您需要分配一个足够大的字符数组来存储连接的字符串,例如

char ciphertext[25] = "ciphertext: ";

也在这个if语句中

    else if(islower(plaintext[j]))
    {
        int l = plaintext[j] - 65;
        char append2 = tolower(cipher[l]);
        //...  

字符串 cipher 中的索引计算不正确。你不应该使用像 65 这样的幻数。至少使用像 'a''A'.

这样的字符