You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言int转char失败:4位字符串加密程序存乱码问题求助

4位字符串加密程序乱码问题分析与解决

问题原因

  1. 字符转换逻辑错误:你将计算后的数字digit直接强制转为char存入数组,这里的digit是0-9的整数,对应的ASCII码属于不可打印的控制字符(比如数字0对应ASCII空字符NUL,数字8对应退格符),因此输出时显示为乱码。
  2. 缺少字符串终止符:output.data作为C字符串使用时必须以'\0'结尾,原代码未添加该终止符,后续输出完整加密字符串时会出现异常。
  3. 交换逻辑与注释不符:注释说明要交换第一个与第四个字符、第二个与第三个字符,但代码错误地交换了索引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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.02 00:43:09