lixiaoyang202 2021-09-17 15:47 采纳率: 100%
浏览 52
已结题

为什么这个程序在输出的时候有乱码?

想了很久很久,改了很多次,但没想到问题出在哪里

/*加密(Encryption) 已知的最古⽼的⼀种加密技术是凯撒加密(得名于 Julius caesar)。该⽅法把⼀条消息中的每个字⺟⽤字⺟表中固定距离之后的那个字⺟来替代。(如果越过了字⺟Z,会绕回到字⺟表的起始位置。例如,如果每个字⺟都⽤字⺟表中两个位置之后的字⺟代替,那么Y就被替换为A,Z就被替换为B。)

编写程序⽤凯撒加密⽅法对消息进⾏加密。⽤户输⼊待加密的消息和移位计数(字⺟移动的位置数⽬):
Enter message to be encrypted: Go ahead, make my day.
Enter shift amount (1-25): 3
Encrypted message: Jr dkhdg, pdnh pb gdb.

注意,当⽤户输⼊26与移位计数的差值时,程序可以对消息进⾏解密:
Enter message to be encrypted: Jr dkhdg, pdnh pb gdb.
Enter shift amount (1-25): 23
Encrypted message: Go ahead, make my day

不是字⺟的那些字符不要改动。此外,加密时不要改变字⺟的⼤⼩写。
输出范例:


Enter message to be encrypted: Hello, world!
Enter shift amount (1-25): 3
Encrypted message: Khoor, zruog!


Enter message to be encrypted: Khoor, zruog!
Enter shift amount (1-25): 23
Encrypted message: Hello, world!
*/


#include<stdio.h>
int main() {
 printf("Enter message to be encrypted :");
 char str[100]; 
 int amount;
 scanf("%[^\n]", &str);
 printf("Enter shift amount(1 - 25) :");
 scanf("%d",&amount);

 int i,z,p;
 int q,m,t;
 if (amount<=12){
 for (i = 0; i < 100; i++) {
  z = str[i];
  p = z + amount;
  if(z<'A'||z>'z'){//转换其他字符1 
   printf("%c",(char)z);
  }else if(z<'a'&&z>'Z'){//转换其他字符2 
   printf("%c",(char)z);
  }else if(z>='A'&&z<='Z'&&p<='Z'){//转换大写字母 
   printf("%c",(char)p);
  }else if(z>='a'&&z<='z'&&p<='z'){//转换小写字母 
   printf("%c",(char)p);
  }else if (z>='A'&&z<='Z'&&p>'Z'){//转换过大的大写字母 
   int rea1;
   rea1=p-90+64;
   printf("%c",(char)rea1);
  }else if(z>='a'&&z<='z'&&p>'z'){//转换过大的小写字母 
   int rea2;
   rea2=p-122+96;
   printf("%c",(char)rea2);
  }//变量q,m,t 
  
 }} else if (amount>12){
  int fact;
  fact=26-amount;//向前移位fact
  for (q = 0; q < 20; q++) {//从a[0]开始计算 
  m = str[q];
  t = m - fact;
  if(m<'A'||m>'z'){//转换其他字符1 
   printf("%c",(char)m);
  }else if(m<'a'&&m>'Z'){//转换其他字符2 
   printf("%c",(char)m);
  }else if(m>='A'&&m<='Z'&&t>='A'){
   printf("%c",(char)t);//转换大写字母 
  }else if(m>='a'&&m<='z'&&t>='a'){//转换小写字母 
   printf("%c",(char)t);
  }else if(m>='A'&&m<='Z'&&t<'A'){//转换过小的大写字母 
   int rea3;
   rea3=t-65+91;
   printf("%c",(char)rea3);
  }else if(z>='a'&&z<='z'&&p<'a'){//转换过小的小写字母 
   int rea4;
   rea4=t-97+123;
   printf("%c",(char)rea4);
  }
 }}

 return 0;
}

输出的结果是这样的

img


  • 写回答

2条回答 默认 最新

  • 快乐鹦鹉 2021-09-17 16:02
    关注

    scanf("%[^\n]", &str);
    这就开始错了啊,str不用加&符号,本身就是指针了

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 9月28日
  • 已采纳回答 9月20日
  • 创建了问题 9月17日

悬赏问题

  • ¥15 用hfss做微带贴片阵列天线的时候分析设置有问题
  • ¥50 我撰写的python爬虫爬不了 要爬的网址有反爬机制
  • ¥15 Centos / PETSc / PETGEM
  • ¥15 centos7.9 IPv6端口telnet和端口监控问题
  • ¥120 计算机网络的新校区组网设计
  • ¥20 完全没有学习过GAN,看了CSDN的一篇文章,里面有代码但是完全不知道如何操作
  • ¥15 使用ue5插件narrative时如何切换关卡也保存叙事任务记录
  • ¥20 海浪数据 南海地区海况数据,波浪数据
  • ¥20 软件测试决策法疑问求解答
  • ¥15 win11 23H2删除推荐的项目,支持注册表等