C - 凯撒加密(分段错误)



我正在尝试编写一个程序,使Caesar对用户给出的字符串进行密码,但是每次我尝试运行它时,都会弹出错误"分段错误"。我做错了什么?

int main(int argc, string argv[])
{
if (argc != 2)
{
return 1;
}
int key = atoi(argv[1]);
printf("Plaintext: ");
string Ptext = get_string();
string cipher = 0;
if(Ptext != NULL)
{
for(int i = 0, n = strlen(Ptext); i < n; i++)
{
if(isalpha(i))
{
if(isupper(i))
{
cipher += toupper(((i + key) % 26));
}
else
{
cipher += tolower(((i + key) % 26));
}
}
cipher += i;
}
printf("Ciphertext: %s", cipher);
printf("n");
}
}

根据我在评论中读到的内容,让我们解决您的帖子最初缺少的一些信息。有一个typedef char* string以及一个提供的get_string()功能。基于这些假设,首先需要分配足够的空间来存储生成的密码字符串。

C 中的字符串只是分配的字符数组,因此您需要以某种方式分配该内存。最好的方法是使用malloc将其分配到堆上。

将此行更改为string cipher = malloc(strlen(Ptext) + 1);string cipher = 0;这将分配足够的空间来存储生成的密文。现在,您需要以某种方式跟踪索引。添加int size = 0;现在,将循环更改为如下所示:

for(int i = 0, n = strlen(Ptext); i < n; i++)
{
if(isalpha(i))
{
if(isupper(i))
{
cipher[size++] = toupper(((i + key) % 26));
}
else
{
cipher[size++] = tolower(((i + key) % 26));
}
}
else 
{
cipher[size++] = i;
}
}
cipher[size] = 0; // for the null terminator

这将做什么与你认为+=会做的事情相同。它将在分配的字符数组中的正确位置插入字符,然后将大小增加 1,以便下一次插入将位于下一个位置。打印字符串后要做的最后一件事是调用free(cipher);以根据malloc释放分配的内存

我建议查找mallocfree的工作原理,以及字符数组在 C 中的工作方式。这是typedef char* string的缺陷之一,也就是说,它抽象出 C 中string的真实含义,即指向char数组的指针。

相关内容

  • 没有找到相关文章

最新更新