目前我的程序中存在一个问题,我正在尝试使用一种非常基本的加密方法,如果输入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]);
}
}
答案 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;
}