C语言移位加密代码key=3时末尾printf语句失效问题
问题根因分析
你遇到的最后一条printf"无法正常工作"不是语句本身故障,是两个逻辑问题共同导致输出被视觉覆盖:
- 第一处问题:
fgets()读取用户输入时,会把输入完文本按下的回车符('\n',ASCII值为10)存入string数组,代码没有提前剔除这个不属于待加密文本的控制字符,导致它也参与了移位计算。当key=3时,'\n' +3 =13,对应ASCII控制符回车'\r'——这个字符不会显示可见内容,作用是直接把光标移动到当前行的最开头。 - 第二处问题:最后一条
printf()没有在输出内容末尾加换行符,输出完加密字符串后光标不会自动切到新行,等程序运行结束终端打印命令提示符时,会直接从当前行首开始输出,把之前printf打印的所有内容全部覆盖,视觉上就像这条语句完全没执行。
修复方法
修改两处代码即可解决问题:
fgets读取完输入字符串后,手动把末尾的换行符替换成字符串结束符'\0',避免控制字符参与加密:fgets(string, 100, stdin); // 新增以下代码剔除读入的换行符 char *newline_pos = strchr(string, '\n'); if (newline_pos != NULL) { *newline_pos = '\0'; }- 最后一条
printf的格式字符串末尾加换行符\n,保证输出结束后光标切换到新行,不会被终端提示符覆盖:printf("The crypto text in key %d is: %s\n", key, string);
可选优化
当前移位逻辑没有处理key大于95、或者key为负数的场景,可以在进入循环前先把key对可打印字符总数(95个,范围是ASCII 32到126)取模,保证任意整数key都能正确移位:
key = key % 95; if (key < 0) key += 95; // 兼容负密钥的解密场景
内容的提问来源于stack exchange,提问作者Arthur
相关产品推荐
相关产品推荐

