到目前为止,这是我针对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,但随后出现分段错误。还有另一个错误,它说它不能打印密文,因为格式表明它是我放置字符串据点时的字符。我该怎么办?
答案 0 :(得分:2)
由于string
是typedef
的{{1}},所以char*
是ciphertext
指针的数组。因此,在期望指针将产生不良结果的情况下分配char
。
您真的不希望char
是ciphertext
的数组。您希望它是另一个与string
大小相同的字符串。您可以使用
plaintext
此外,我将两次计算string ciphertext=malloc(strlen(plaintext)+1); // The +1 is for the null-terminator.
。做
strlen(plaintext)