我刚刚在CS50中解决了Vigenere问题,但是仍然只有一个错误,非字母字符,当您以纯文本形式编写任何不带空格,逗号,任何非字母字符的东西时,程序将运行良好,但是如果您编写了任何非字母字符,例如空格,则下一个字符将使用错误的键,这是我的代码:
#include <cs50.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
int main(int argc, string argv[])
{
// Make sure there is a command-line argment
if (argc != 2)
{
printf("Error\n");
return 1;
}
// Variables
int key[strlen(argv[1])];
string plaintext;
// Make sure the comman-line argment is Alphabets then make the key
for (int i = 0, n = strlen(argv[1]); i < n; i++)
{
if (!isalpha(argv[1][i]))
{
printf("Error 2\n");
return 1;
}
if (islower(argv[1][i]))
{
key[i] = argv[1][i] - 'a';
}
else if (isupper(argv[1][i]))
{
key[i] = argv[1][i] - 'A';
}
}
// Ask the user to write the message
plaintext = get_string("plaintext: ");
printf("ciphertext: ");
// Make sure the plaintext doesn't equal NULL
if (plaintext != NULL)
{
for (int i = 0, n = strlen(plaintext); i < n ; i++)
{
// Print in slower case
if (islower(plaintext[i]))
{
printf("%c", (((plaintext[i] + key[i % strlen(argv[1])]) - 'a') % 26) + 'a');
}
// Print in upper case
else if (isupper(plaintext[i]))
{
printf("%c", (((plaintext[i] + key[i % strlen(argv[1])]) - 'A') % 26) + 'A');
}
// Print the non alphabetic
else if (!isalpha(plaintext[i]))
{
printf("%c", plaintext[i]);
}
}
// Print a new line
printf("\n");
}
}
答案 0 :(得分:1)
问题是因为您为此明文和键使用了相同的索引
for (int i = 0, n = strlen(plaintext); i < n ; i++)
循环。每次明文操作时,键都会前进一个位置。显然,这不是您想要的。您需要独立于该循环中的明文索引来管理键索引。
建议您重新观看the walkthrough,并可能像Zamyla所做的熊猫示例一样编写示例。学习如何使用debug50永远不会太早。如果我没记错的话,第二周有一个简短的说法。
CS50x has a stack forum专门讨论关于CS50x和pset的问题。