|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
- #include <stdio.h>
- #include <string.h>
- int main()
- {
- int i=0,shift;
- char ch,message[50] = {0};
- while ((ch = getchar()) != '\n')
- {
- message[i] = ch;
- i++;
- }
- scanf("%d", &shift);
- for(i = 0; i < strlen(message); i++)
- {
- if(message[i] >= 'a' && message[i] <= 'z')
- {
- if ((message[i] - 'a' + shift) >= 0)
- message[i] = (message[i] - 'a' + shift) % 26 + 'a';
- if ((message[i] - 'a' + shift) < 0)
- message[i] = (message[i] - 'a' + shift+1) % 26 + 'z';
- }
- else if(message[i] >= 'A' && message[i] <= 'Z')
- {
- if ((message[i] - 'a' + shift) >= 0)
- message[i] = (message[i] - 'A' + shift) % 26 + 'A';
- if ((message[i] - 'a' + shift) < 0)
- message[i] = (message[i] - 'A' + shift+1) % 26 + 'Z';
- }
- }
- printf("%s",message);
- return 0;
- }
复制代码
问题分析:这段代码是一个简单的凯撒密码加密程序,但是在加密过程中,当shift为负数时会出现错误。
问题解决:在代码中,当shift为负数时,需要对字母的ASCII码进行合适的处理,使其能够循环地从z或Z开始向前移动。
以下是修改后的代码:
- #include <stdio.h>
- #include <string.h>
- int main()
- {
- int i = 0, shift;
- char ch, message[50] = {0};
-
- while ((ch = getchar()) != '\n')
- {
- message[ i] = ch;
- i++;
- }
-
- scanf("%d", &shift);
- for(i = 0; i < strlen(message); i++)
- {
- if(message[ i] >= 'a' && message[ i] <= 'z')
- {
- if ((message[ i] - 'a' + shift) >= 0)
- message[ i] = (message[ i] - 'a' + shift) % 26 + 'a';
- else
- message[ i] = (message[ i] - 'a' + shift + 26) % 26 + 'a';
- }
- else if(message[ i] >= 'A' && message[ i] <= 'Z')
- {
- if ((message[ i] - 'A' + shift) >= 0)
- message[ i] = (message[ i] - 'A' + shift) % 26 + 'A';
- else
- message[ i] = (message[ i] - 'A' + shift + 26) % 26 + 'A';
- }
- }
-
- printf("%s",message);
-
- return 0;
- }
复制代码
在修改后的代码中,当shift为负数时,我们使用了 (message[ i] - 'a' + shift + 26) % 26 和 (message[ i] - 'A' + shift + 26) % 26 来实现循环移动。
这样修改后的代码就可以正确处理shift为负数的情况,实现了凯撒密码的加密功能。
|
|