C当变量范围改变时给出奇怪的输出

时间:2018-09-29 18:46:08

标签: c

当我将 nonAlphaCount 声明放在for循环上方时,

C会执行一些令人毛骨悚然的事情。我无法解释为什么输出不同。

对于版本1(主方法上方的int声明),我的输入输出是: 输入:./Vigenere.exe培根 输入纯文本:上午11点在公园与我见面 输出:Negh zf av huf pcfx bt gzrwep oz

对于版本2(上面for循环的int声明) 输入:./Vigenere.exe培根 输入纯文本:上午11点在公园与我见面 输出:NRQ Q M [L \ M ^^ K QXXZQZ M

#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <unistd.h>

const int INPUT_LEN = 255; 
const int ALPHABET_LEN = 26;
int nonAlphaCount = 0;

int main (int count, char *args[])
{

    char plainText[INPUT_LEN];
    char *cipherText;
    char *keyWord;

    if ( count < 2 || count > 2)
    {
        printf("There is no key");
        return 1;
    }

    strcpy(keyWord, args[1]);
    int keyWord_LEN = strlen(keyWord);

    printf("Enter plain text: ");
    fgets (plainText, INPUT_LEN, stdin);

    int strLength = strlen(plainText);
    cipherText = malloc(strLength);

    printf("%s", plainText);

    for (int i = 0; i < strLength; i++ ){

        if(plainText[i] == '\0' || plainText[i] == '\n'|| plainText[i] == '\r')
            break;

        if(isalpha(plainText[i]))
        {
            // Default lower 
            int asciiUpperOrLower = 97;   
            int keyUpperOrLower = 97;    

            if(isupper(plainText[i]))
                asciiUpperOrLower = 65;

            if(isupper(keyWord[i % keyWord_LEN]))
                keyUpperOrLower = 65;

            int Key = keyWord[(i - nonAlphaCount) % keyWord_LEN] - keyUpperOrLower;
            int alphabetBaseletter = ((plainText[i] - asciiUpperOrLower + Key) % ALPHABET_LEN);

            cipherText[i] = alphabetBaseletter + asciiUpperOrLower;
        }
        else{
            cipherText[i] = plainText[i];
            nonAlphaCount++;
        }

    }

    // Set string terminator.
    cipherText[strLength - 1] = '\0' ;

    printf("%s", cipherText);

    return 0;

}





#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <unistd.h>

const int INPUT_LEN = 255; 
const int ALPHABET_LEN = 26;

int main (int count, char *args[])
{

    char plainText[INPUT_LEN];
    char *cipherText;
    char *keyWord;

    if ( count < 2 || count > 2)
    {
        printf("There is no key");
        return 1;
    }

    strcpy(keyWord, args[1]);
    int keyWord_LEN = strlen(keyWord);

    printf("Enter plain text: ");
    fgets (plainText, INPUT_LEN, stdin);

    int strLength = strlen(plainText);
    cipherText = malloc(strLength);

    printf("%s", plainText);

**int nonAlphaCount = 0;**
    for (int i = 0; i < strLength; i++ ){

        if(plainText[i] == '\0' || plainText[i] == '\n'|| plainText[i] == '\r')
            break;

        if(isalpha(plainText[i]))
        {
            // Default lower 
            int asciiUpperOrLower = 97;   
            int keyUpperOrLower = 97;    

            if(isupper(plainText[i]))
                asciiUpperOrLower = 65;

            if(isupper(keyWord[i % keyWord_LEN]))
                keyUpperOrLower = 65;

            int Key = keyWord[(i - nonAlphaCount) % keyWord_LEN] - keyUpperOrLower;
            int alphabetBaseletter = ((plainText[i] - asciiUpperOrLower + Key) % ALPHABET_LEN);

            cipherText[i] = alphabetBaseletter + asciiUpperOrLower;
        }
        else{
            cipherText[i] = plainText[i];
            nonAlphaCount++;
        }

    }

    // Set string terminator.
    cipherText[strLength - 1] = '\0' ;

    printf("%s", cipherText);

    return 0;

}

1 个答案:

答案 0 :(得分:1)

两个程序都在

中显示未定义的行为

char *keyWord;
...
strcpy(keyWord, args[1]);

,由编译器警告显示:“使用了未初始化的局部变量'keyWord'”。您尚未分配任何内存。

如果其中一个程序碰巧可以正常工作,那么