为什么' a'过早地结束这个循环?

时间:2017-04-24 22:47:14

标签: c cs50

如果你愿意的话,请指点而不是直接答案。

此循环对字符进行一些操作,并根据键c和一些明文k输出密文p

当' a'或者' A'在明文中出现,程序将按预期输出该字母,但过早地结束循环。

p突然变成一个字符长,这个字符为1。

while (i < strlen(p))
{
    char stdp = p[i];
    char stdk = k[j];

    if (isalpha(stdp))
    {
        if (islower(stdp))
        {
            p[i] = stdp - 'a';
            Aa = 0;
        }
        else
        {
            p[i] = stdp - 'A';
            Aa = 1;
        }

        if (islower(k[j]))
        {
            k[j] = stdk - 'a';
        }
        else
        {
            k[j] = stdk - 'A';
        }
    }

    if (isalpha(stdp))
    {
        c[i] = ((p[i] + k[j]) % 26);
    }
    else
    {
        c[i] = p[i];
    }

    if (isalpha(stdp))
    {
        if (Aa == 1)
        {
            c[i] = c[i] + 'A';
        }
        else if (Aa == 0)
        {
            c[i] = c[i] + 'a';
        }
    }

    if (isalpha(stdp))
    {
        if (j + 1 == kk)
        {
            j = (j + 1) % kk;
            strcpy(k, argv[1]);
        }
        else
        {
            j++;
        }
    }

    i++;
}

1 个答案:

答案 0 :(得分:0)

我现在已经解决了程序早期终止所面临的问题。

大多数问题似乎已经通过停止常量引用strlen(p)并将其分配给静态变量来解决。我试图按照建议整理代码。

int main(int argc, char *argv[])
{
if (argc != 2 || argv[1] == NULL)//no more than 1 arg  and not empty
{
    printf("Command requires one argument to run.\n");
    return 1;
}

char *k = malloc(100);
strcpy(k, argv[1]);
int kInt = strlen(k);

for (int i = 0, n = kInt; i < n ; i++)// iterating though the key to check it is alphabetic
{
    if (isalpha(k[i]) == false)
    {
        printf("Make sure key is alphabetic!\n");
        return 1;
    }
}

printf ("plaintext: ");  

char *p = malloc(100);
strcpy(p, get_string());
int pInt = strlen(p);

int i = 0;
int j = 0;
int Aa = 0;

char *c = malloc(100);

while (j < kInt)
{
    if (islower(k[j]))
    {
        k[j] = k[j] - 'a';
    }
    else                
    {
        k[j] = k[j] - 'A';
    }
    j++;
}

j = 0;

while (i < pInt)
{
    if (isalpha(p[i]))
    {
        if (islower(p[i]))
        {
            p[i] = p[i] - 'a';
            Aa = 0;
        }
        else
        {
            p[i] = p[i] - 'A';
            Aa = 1;
        }

        c[i] = ((p[i] + k[j]) % 26);

        if (Aa == 1)
        {
            c[i] = c[i] + 'A';
        }
        else if (Aa == 0)
        {
            c[i] = c[i] + 'a';
        }

        if (j + 1 == kInt)
        {
            j = (j+1) % kInt;
        }
        else
        {
            j++;
        }
    }
    else if (isalpha(p[i]) != true)
    {
        c[i] = p[i];
    }

    i++;
}

printf("ciphertext: %s\n", c);

free(c);
free(k);
free(p);
}