为什么我的代码在加密第二个单词后插入3个空格?

时间:2018-01-13 09:43:29

标签: c cs50

请查看以下代码和屏幕截图。由于某种原因,它会打印3个空格,从而过多地移动键2。

picture

代码实际上应该像这样:

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]);
            }
        }
    }
}

1 个答案:

答案 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;情况并非如此,因此将打印额外的空格