我的 "Vigenere CS 50" 项目运行不正常
My "Vigenere CS 50" project doesn't work well
我目前正在研究 Vigenere CS 50 问题。代码看起来运行良好,但有时输出会被添加到输出字符串末尾的其他符号混淆。例如,当我用 "a" 的密钥加密 "a" 时,输出有时会像 "a" 一样正常,有时看起来像 "a<" 或 "aR"或 "a{7"...
同时,代码在更长的键和更复杂的纯文本下工作正常,所以我现在真的很困惑,不知道从什么开始。
你能看一下代码吗?
提前致谢,
弗拉基米尔
#include <stdio.h>
#include <cs50.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
int main(int argc, string argv[])
{
if (argc != 2)
{
printf("Usage: ./vigenere k\n");
return 1;
}
string k = (argv[1]);
int key[strlen(k)];
int n = strlen(k);
for (int i = 0; i < n; i++)
{
if (isalpha(k[i]))
{
if (isupper(k[i]))
{
key[i] = (int)k[i] - 65;
}
else
{
key[i] = (int)k[i] - 97;
}
}
else
{
printf("Key must be alphabetical\n");
return 1;
}
}
string p;
do
{
printf("plaintext: ");
p = get_string();
} while (p == NULL);
char c[strlen(p)];
int cn = 0;
for (int j = 0, m = strlen(p); j < m; j++)
{
if (isalpha(p[j]))
{
if (isupper(p[j]))
{
c[j] = (((int)p[j] + key[cn] - 65) % 26 + 65);
}
else
{
c[j] = (((int)p[j] + key[cn] - 97) % 26 + 97);
}
cn++;
cn = cn % n;
}
else
{
c[j] = p[j];
}
}
printf("ciphertext: %s", c);
printf("\n");
return 0;
}
这是一个很好的老式 "not null terminated" 字符串。 C 样式字符串(这是您使用 char c[strlen(p)];
创建的字符串)没有与之关联的长度。为了计算它们的长度,标准库假定它们将以 [=11=]
(空字节)终止。你没有这样做,所以当你 printf
时,它会继续打印直到找到一个。
您需要:
- 为空字节分配足够的space:
char c[strlen(p) + 1];
- 放在最后:
c[strlen(p)] = 0;
我目前正在研究 Vigenere CS 50 问题。代码看起来运行良好,但有时输出会被添加到输出字符串末尾的其他符号混淆。例如,当我用 "a" 的密钥加密 "a" 时,输出有时会像 "a" 一样正常,有时看起来像 "a<" 或 "aR"或 "a{7"...
同时,代码在更长的键和更复杂的纯文本下工作正常,所以我现在真的很困惑,不知道从什么开始。
你能看一下代码吗?
提前致谢, 弗拉基米尔
#include <stdio.h>
#include <cs50.h>
#include <string.h>
#include <ctype.h>
#include <stdlib.h>
int main(int argc, string argv[])
{
if (argc != 2)
{
printf("Usage: ./vigenere k\n");
return 1;
}
string k = (argv[1]);
int key[strlen(k)];
int n = strlen(k);
for (int i = 0; i < n; i++)
{
if (isalpha(k[i]))
{
if (isupper(k[i]))
{
key[i] = (int)k[i] - 65;
}
else
{
key[i] = (int)k[i] - 97;
}
}
else
{
printf("Key must be alphabetical\n");
return 1;
}
}
string p;
do
{
printf("plaintext: ");
p = get_string();
} while (p == NULL);
char c[strlen(p)];
int cn = 0;
for (int j = 0, m = strlen(p); j < m; j++)
{
if (isalpha(p[j]))
{
if (isupper(p[j]))
{
c[j] = (((int)p[j] + key[cn] - 65) % 26 + 65);
}
else
{
c[j] = (((int)p[j] + key[cn] - 97) % 26 + 97);
}
cn++;
cn = cn % n;
}
else
{
c[j] = p[j];
}
}
printf("ciphertext: %s", c);
printf("\n");
return 0;
}
这是一个很好的老式 "not null terminated" 字符串。 C 样式字符串(这是您使用 char c[strlen(p)];
创建的字符串)没有与之关联的长度。为了计算它们的长度,标准库假定它们将以 [=11=]
(空字节)终止。你没有这样做,所以当你 printf
时,它会继续打印直到找到一个。
您需要:
- 为空字节分配足够的space:
char c[strlen(p) + 1];
- 放在最后:
c[strlen(p)] = 0;