我正在尝试编写一个程序,使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
释放分配的内存
我建议查找malloc
和free
的工作原理,以及字符数组在 C 中的工作方式。这是typedef char* string
的缺陷之一,也就是说,它抽象出 C 中string
的真实含义,即指向char
数组的指针。