请查看以下代码和屏幕截图。由于某种原因,它会打印3个空格,从而过多地移动键2。
代码实际上应该像这样:
Plaintext: M|e|e|t| |m|e| |a|t| |t|h|e| |P|a|r|k
Keyword: a|b|c|d|e|a|b|c|d|e|a|b|c|d|e|a|b|c|d
Move letter by: 0|1|2|3|4|0|1|2|3|4|0|1|2|3|4|0|1|2|3|
但出于某种原因,在" me"之后它没有做一个空格。喜欢它之后" Meet"但是3个空格......
是的,我自己尝试过调试。
#include <cs50.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main(int argc, string argv[1])
{
bool keySuccesful = false;
string keyword;
do
{
// Check whether argc is 2. If not print the following. Else turn argv[1] into an int and set keySuccesful to true.
if (argc != 2)
{
printf("You didn't submit a valid encryption key.\n");
printf("Please check your input and re-run the programm.\n");
printf("We require an integer as encryption key.\n");
return 1;
}
else
{
// Key needs to be converted from string to int
keyword = argv[1];
keySuccesful = true;
}
} while (!keySuccesful); // repeat while keySuccessful is false.
string plain = get_string("plaintext: "); // Get plaintext/
printf("ciphertext: "); // Print "ciphertext: "
for (int k = 0; k < strlen(plain); k++) // loop through each character of the plaintext, start at index 0, until the length of the string.
{
for (int u = 0; u <strlen(keyword); u++)
{
int g = keyword[u] - 97;
if(isalpha(plain[k])) // check that chacater is a letter
{
if (isupper(plain[k])) // if letter is uppercase
{
printf("%c", ((((plain[k] - 65)+g)%26)+65));
}
if (islower(plain[k])) // if letter is lowercase
{
printf("%c", ((((plain[k] - 97)+g)%26)+97));
}
k++;
}
else
{
printf("%c", plain[k]);
}
}
}
}
答案 0 :(得分:0)
我认为问题是您在<{1}}块内仅增加k
。因此,可以/可以多次处理空间,即直到isalpha
结束。
尝试:
for (int u = 0; u <strlen(keyword); u++)
除了你的嵌套循环错误,因为你可能在内循环中增加 // k++; Remove this line
}
else
{
printf("%c", plain[k]);
}
k++; // Insert this line
太多,因此读出界限。
考虑改变
k
到
for (int u = 0; u <strlen(keyword); u++)
注意:您的代码似乎适用于第一个空间的原因是&#34; Meet&#34;恰好与您的关键字具有相同的长度。因此,内部循环恰好在处理空间一次后停止。但对于&#34;我&#34;情况并非如此,因此将打印额外的空格