使用modulo循环9-0并打印

时间:2015-12-07 14:29:16

标签: c arrays modulo

目前我的程序中存在一个问题,我正在尝试使用一种非常基本的加密方法,如果输入5,则打印9。我试图让它循环,以便z将变为d,9将变为3.我目前已经添加了4,但它不是从9-0为整数进行循环,对于字母它正常工作。< / p>

下面是一段代码,它由我的代码元素组成,用于重现正在发生的事情。

#include <stdio.h>
#include <conio.h>

int main()
{

int i, j;
char password[9];


printf("Please enter a password:\n\n");
scanf("%8c", &password);



for(i = 0; i < 8; i++)
    {
        if(password[i] >= '0' && password[i] <= '9')
        {
            password[i] = (char)(password[i] + 4 % 10);
        }

        if((password[i] >= 'a' && password[i] <= 'z') || (password[i] >= 'A' && password[i] <= 'Z') )
        {
            password[i] = (char)((password[i] - 'a' + 4) % 26 + 'a');
        }
    }

    for(j =  0; j < 8; j++)
    {
        printf("%c", password[j]);
    }

}

2 个答案:

答案 0 :(得分:2)

你必须完全相同地处理数字和字母。你有:

        password[i] = (char)(password[i] + 4 % 10);
        ...
        password[i] = (char)((password[i] - 'a' + 4) % 26 + 'a');

您需要为数字减去并添加'0',就像使用'a'字母一样:

        password[i] = (char)((password[i] - '0' + 4) % 10 + '0');
        ...
        password[i] = (char)((password[i] - 'a' + 4) % 26 + 'a');

答案 1 :(得分:2)

  • password[i] + 4 % 10始终等于password[i] + 4,因为%的优先级高于+
  • 由于类型不匹配,
  • scanf("%8c", &password);会导致未定义的行为。删除&并将其写为scanf("%8c", password);
  • 您应该分别处理大写字母和小写字母,因为例如'A' - 'a' + 4如果您使用ASCII代码就会变为负值,结果将是您不想要的结果。

试试这个:

#include <stdio.h>

int main(void)
{

    int i, j;
    char password[9] = "{0}";

    printf("Please enter a password:\n\n");
    scanf("%8c", password);

    for(i = 0; i < 8; i++)
    {
        if(password[i] >= '0' && password[i] <= '9')
        {
            password[i] = (char)((password[i] + 4) % 10);
        }

        if(password[i] >= 'a' && password[i] <= 'z')
        {
            password[i] = (char)((password[i] - 'a' + 4) % 26 + 'a');
        }

        if(password[i] >= 'A' && password[i] <= 'Z')
        {
            password[i] = (char)((password[i] - 'A' + 4) % 26 + 'A');
        }
    }

    for(j =  0; j < 8; j++)
    {
        printf("%c", password[j]);
    }

    putchar('\n');
    return 0;
}