C程序意外终止

时间:2014-04-28 05:21:05

标签: c encryption

#include <stdio.h>
#include <string.h>
#include <stdlib.h>


void encrypting(char cipher[25], int shift, int num)
{
    int i;
    for (i = 0; i < num; i++)
    {
        if (cipher[i] >= 'A' && cipher[i] <= 'Z')
        {
            cipher[i] = (char)(((cipher[i] + shift - 'A' + 26) % 26) + 'A');
        }
        else if (cipher[i] >= 'a' && cipher[i] <= 'z')
        {
            cipher[i] = (char)(((cipher[i] + shift - 'a' + 26) % 26) + 'a');
        }
    }
}

void decrypting(char cipher[25], int shift, int num)
{
    inti;
    for (i = 0; i < num; i++)
    {
        if (cipher[i] >= 'A' && cipher[i] <= 'Z')
        {
            cipher[i] = (char)(((cipher[i] - shift - 'A' + 26) % 26) + 'A');
        }
        else if (cipher[i] >= 'a' && cipher[i] <= 'z')
        {
            cipher[i] = (char)(((cipher[i] - shift - 'a' + 26) % 26) + 'a');
        }
    }
}

int main()
{
    char text[10];
    static const char encrypt[] = "2";
    static const char decrypt[] = "1";
    int shift;
    char cipher[25];
    int result1;
    int result2;
    int num;
    int i;



    printf("Enter operation: encrypt or decrypt/n");
    printf("Press 1 to Encrypt or 2 to Decrypt");
    scanf("%c", &text);
    printf("Enter shift key");
    scanf("%d", &shift);
    printf("Enter text to encrypt/decrypt");
    fflush(stdin);
    scanf("%c", &cipher);

    num = strlen(cipher);

    result1 = strcmp(text, encrypt);
    result2 = strcmp(text, decrypt);

    if (result1 == 0)
    {
        decrypting(cipher, shift, num);
    }
    else { exit(0); }

    if (result2 == 0)
    {
        encrypting(cipher, shift, num);
    }
    else { exit(0); }

    printf("Result");
    printf("%d", cipher);
}

用户输入密码文本后,程序意外终止。我不知道现在的问题是什么。任何人都可以解释我的代码现在的问题吗?所有帮助表示赞赏。

2 个答案:

答案 0 :(得分:1)

格式字符串%c中的scanf转换说明符不会丢弃前导空格字符。这意味着在以下'\n'调用后,换行符scanf将保留在缓冲区中 -

scanf("%d", &shift);

此换行符将在下一个scanf来电 -

中阅读
scanf("%c", &cipher);

这是因为在输入流上调用fflush是未定义的行为。它仅为输出流定义。这意味着以下陈述是错误的 -

fflush(stdin);

我建议你使用fgets来读取输入字符串,然后从字符串中提取字符。此外,输出换行符立即在屏幕上打印消息。

答案 1 :(得分:0)

因为无论用户是想加密还是解密,您都会在exit(0);之前调用printf("Result");。变化:

else{exit(0);}

if(result2 == 0)

要:

else if(result2 == 0)

如果他们既不选择加密也不选择解密,那么它只会调用exit(0);


此外,printf("%d",cipher);无法打印字符串。您需要使用%s转化说明符而不是%d