Vigenere cs50 Pset2 末尾的额外字符
Extra Characters at the end of Vigenere cs50 Pset2
我是编码新手,已经做了几个星期了。我现在正在参加 cs50 课程,并且我已经为 pset2 vigenere 编写了代码。当我使用 check50 时,我意识到它要我在不跳过密钥的情况下考虑空格和非字母。
我添加了 "j--;",虽然代码是正确的,但它现在会在密文末尾创建额外的随机字符。
此外,当检查 argv[1] 时我的代码中只有字母,我有一个 if 语句,其正文中有 "int key = argv[1][i];"。它什么都不做,但我不知道如何让它继续检查下一个字符而没有空体,这是不允许的。
如有任何帮助,我们将不胜感激!非常感谢你!
#include <cs50.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main(int argc, string argv[0])
{
//making sure it is not more than one command line
if (argc != 2)
{
printf("Usage: ./vigenere key \n");
return 1;
}
//if it is one command line, making sure the input is just letters
if (argc == 2)
{
for (int i = 0, n = strlen(argv[1]); i < n; i++)
{
if (isalpha(argv[1][i]))
{
int key = argv[1][i];
}
else
{
printf("Usage: ./vigenere key \n");
return 1;
}
}
}
//asking user for input text
string plaintext = get_string("plaintext: ");
printf("ciphertext:");
//going through a loop to turn plain text into ciphertext
int i = 0;
int n = strlen(plaintext);
string key = argv[1];
//looping through the key
while (i < n)
{
for (int j = 0, m= strlen(key); j < m; j++, i++)
{
//using the asci of each char as an int
int asc = (plaintext[i]);
int k = key[j];
//if lowercase
if (k >= 97 && k <= 122)
{
k -= 97;
}
else
{
k -= 65;
}
//if lowercase
if (asc >= 97 && asc <= 122)
{
printf("%c", ((((asc - 97) + k) % 26) + 97));
}
//if uppercase
else
{
if (asc >= 65 && asc <= 90)
{
printf("%c", ((((asc - 65) + k) % 26) + 65));
}
//if non-letter
else
{
printf("%c", asc);
j--;
}
}
}
}
printf("\n");
}
这些是预期结果与实际结果:
key: baz
plaintext: hello, world!
expected ciphertext: iekmo, vprke!
actual ciphertext: iekmo, vprke!!pu
因为程序递增 i
这里 for (int j = 0, m= strlen(key); j < m; j++, i++)
,它允许读取明文的末尾。在 for 循环完成之前,while 循环不会计算 i
。这有可能导致无限循环,具体取决于明文结束后内存的内容。如果它从未遇到 a-z 或 A-Z 范围内的东西,它将永远 j--
。
如果 i == strlen(plaintext)
.
,您需要跳出 for 循环
我是编码新手,已经做了几个星期了。我现在正在参加 cs50 课程,并且我已经为 pset2 vigenere 编写了代码。当我使用 check50 时,我意识到它要我在不跳过密钥的情况下考虑空格和非字母。
我添加了 "j--;",虽然代码是正确的,但它现在会在密文末尾创建额外的随机字符。
此外,当检查 argv[1] 时我的代码中只有字母,我有一个 if 语句,其正文中有 "int key = argv[1][i];"。它什么都不做,但我不知道如何让它继续检查下一个字符而没有空体,这是不允许的。
如有任何帮助,我们将不胜感激!非常感谢你!
#include <cs50.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main(int argc, string argv[0])
{
//making sure it is not more than one command line
if (argc != 2)
{
printf("Usage: ./vigenere key \n");
return 1;
}
//if it is one command line, making sure the input is just letters
if (argc == 2)
{
for (int i = 0, n = strlen(argv[1]); i < n; i++)
{
if (isalpha(argv[1][i]))
{
int key = argv[1][i];
}
else
{
printf("Usage: ./vigenere key \n");
return 1;
}
}
}
//asking user for input text
string plaintext = get_string("plaintext: ");
printf("ciphertext:");
//going through a loop to turn plain text into ciphertext
int i = 0;
int n = strlen(plaintext);
string key = argv[1];
//looping through the key
while (i < n)
{
for (int j = 0, m= strlen(key); j < m; j++, i++)
{
//using the asci of each char as an int
int asc = (plaintext[i]);
int k = key[j];
//if lowercase
if (k >= 97 && k <= 122)
{
k -= 97;
}
else
{
k -= 65;
}
//if lowercase
if (asc >= 97 && asc <= 122)
{
printf("%c", ((((asc - 97) + k) % 26) + 97));
}
//if uppercase
else
{
if (asc >= 65 && asc <= 90)
{
printf("%c", ((((asc - 65) + k) % 26) + 65));
}
//if non-letter
else
{
printf("%c", asc);
j--;
}
}
}
}
printf("\n");
}
这些是预期结果与实际结果:
key: baz
plaintext: hello, world!
expected ciphertext: iekmo, vprke!
actual ciphertext: iekmo, vprke!!pu
因为程序递增 i
这里 for (int j = 0, m= strlen(key); j < m; j++, i++)
,它允许读取明文的末尾。在 for 循环完成之前,while 循环不会计算 i
。这有可能导致无限循环,具体取决于明文结束后内存的内容。如果它从未遇到 a-z 或 A-Z 范围内的东西,它将永远 j--
。
如果 i == strlen(plaintext)
.