C语言int转char失败:4位字符串加密程序存乱码问题求助
4位字符串加密程序乱码问题分析与解决
问题原因
- 字符转换逻辑错误:你将计算后的数字
digit直接强制转为char存入数组,这里的digit是0-9的整数,对应的ASCII码属于不可打印的控制字符(比如数字0对应ASCII空字符NUL,数字8对应退格符),因此输出时显示为乱码。 - 缺少字符串终止符:
output.data作为C字符串使用时必须以'\0'结尾,原代码未添加该终止符,后续输出完整加密字符串时会出现异常。 - 交换逻辑与注释不符:注释说明要交换第一个与第四个字符、第二个与第三个字符,但代码错误地交换了索引0和2、1和3,实际应交换索引0和3、1和2。
解决方法
核心修正点
- 数字转可打印字符:把
output.data[i] = (char) digit;改为output.data[i] = digit + '0';,利用ASCII码的连续性,让数字0-9对应字符'0'-'9'。 - 添加字符串终止符:循环结束后设置
output.data[4] = '\0';,确保数组是合法的C字符串。 - 修正交换逻辑:调整交换的索引,匹配注释要求的交换规则。
- 可选优化:处理
fgets读入的换行符,避免换行符干扰后续处理。
修正后的完整代码
#include <stdio.h> #include <string.h> // 用于strcspn函数处理换行符 typedef struct Char4 { char data[5]; } char4_t; char4_t encryptText(char4_t input) { char4_t output; for (int i = 0; i < sizeof(input.data)-1; i++) { int digit = input.data[i] - '0'; printf("Digit %d before encryption: %d\n", i, digit); digit += 7; digit %= 10; printf("Digit %d after encryption: %d\n", i, digit); // 修正:将数字转为对应的ASCII字符 output.data[i] = digit + '0'; printf("output.data[%d]: %c\n", i, output.data[i]); } // 添加字符串终止符 output.data[4] = '\0'; printf("\n"); // 修正交换逻辑:第一个(0)与第四个(3)交换,第二个(1)与第三个(2)交换 char buffer = output.data[0]; output.data[0] = output.data[3]; output.data[3] = buffer; buffer = output.data[1]; output.data[1] = output.data[2]; output.data[2] = buffer; return output; } int main(void) { char4_t text; char4_t encrypted; printf("Introduce text to encrypt: "); fgets(text.data, sizeof(text.data), stdin); // 处理fgets读入的换行符,替换为终止符 text.data[strcspn(text.data, "\n")] = '\0'; encrypted = encryptText(text); // 输出加密后的完整字符串 printf("Encrypted text: %s\n", encrypted.data); return 0; }
测试效果(输入1234)
控制台输出将变为:
Introduce text to encrypt: 1234 Digit 0 before encryption: 1 Digit 0 after encryption: 8 output.data[0]: 8 Digit 1 before encryption: 2 Digit 1 after encryption: 9 output.data[1]: 9 Digit 2 before encryption: 3 Digit 2 after encryption: 0 output.data[2]: 0 Digit 3 before encryption: 4 Digit 3 after encryption: 1 output.data[3]: 1 Encrypted text: 1098
内容的提问来源于stack exchange,提问作者CR0N0S.LXIII
相关产品推荐
相关产品推荐

