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

C语言字符数组首字符丢失问题及加密数字排版需求

C语言加密程序修复:首字符缺失与格式排版优化

问题说明

  1. 输入关键词cortina后,输出缺失首字符C,仅显示ortina
  2. 需要将加密后的数字集按指定格式排版在大写关键词下方,示例如下:
C O R T I N A
1 1 0 0 3 4 0
3 4 5 6 3 2 5
2 3 4 5 6 7 8 
2 3 4 3 2 4 5

1. 首字符缺失问题修复

问题原因

main函数中用scanf("%d", &choice)读取选项后,输入缓冲区残留的换行符会被encryptmessage1和encryptmessage2中的getchar()读取,导致实际输入的关键词/消息首字符被跳过。

修复步骤

  • 在scanf读取选项后,添加代码清理输入缓冲区的残留换行:
scanf("%d", &choice);
// 清理输入缓冲区中残留的换行符
while (getchar() != '\n');
  • 删除encryptmessage1和encryptmessage2中的temp = getchar();语句,避免重复读取字符。

2. 格式排版优化

实现要求

  • 大写关键词的每个字符之间用空格分隔输出
  • 加密后的数字集每行的每个数字之间用空格分隔,与上方关键词的字符数量对应

修改要点

关键词输出格式调整

在encryptmessage2中,将关键词转大写后,按「字符+空格」的格式输出(最后一个字符无空格):

// 输出带空格的大写关键词
int key_len = strlen(key);
for (i = 0; i < key_len; i++) {
    printf("%c", key[i]);
    if (i != key_len - 1) {
        printf(" ");
    }
}
printf("\n");

加密数字集格式调整

在encryptmessage1中,将加密后的数字按每行对应关键词长度的格式输出,每个数字之间用空格分隔:

// 按格式输出加密数字(将每两个字符拆分为一个数字,按空格分隔)
printf("加密数字集:\n");
for (i = 0; temparr[i] != '\0'; i += 2) {
    printf("%c%c", temparr[i], temparr[i+1]);
    if (i+2 < strlen(temparr)) {
        printf(" ");
    }
}
printf("\n");

修改后的完整代码

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>

void encryptmessage1(char[][6]);
void encryptmessage2(char[][6]);

int main()
{
    char array[5][6] = {
        {'A', 'B', 'C', 'D', 'E'},
        {'F', 'G', 'H', 'I', 'J'},
        {'K', 'L', 'M', 'N', 'O'},
        {'P', 'Q', 'Z', 'R', 'S', 'T'},
        {'U', 'V', 'W', 'X', 'Y'}
    };
    int choice;

    printf("********************************\n");
    printf("**ENCRYPTION/DECRYPTION SYSTEM**\n");
    printf("********************************\n");
    printf("\n");
    printf("1.Code the message\n");
    printf("2.Decode the message\n");
    printf("3.EXIT\n");
    printf("Make your choice: ");
    scanf("%d", &choice);
    // 清理输入缓冲区的换行符
    while (getchar() != '\n');

    switch (choice) {
    case 1:
        encryptmessage1(array);
        encryptmessage2(array);
        break;

    case 2:
        // decrypt message
        break;

    default:
        break;
    }

    return 0;
}

void encryptmessage1(char array[][6])
{
    int i, j, loop, k = 0, row, col, len = 0;
    char str[80] = {};
    char temparr[80] = {};                   // temporary array

    printf("Please enter your message : ");
    // 读取字符串,不再需要额外的getchar()
    while ((str[k] = getchar()) != '\n') {
        k++;
    }
    str[k] = '\0'; // 手动添加字符串结束符

    // 复制原字符串到临时数组
    strcpy(temparr, str);

    // 计算字符串实际长度
    len = strlen(str);
    // 移除字符串中的空格
    for (i = 0; i < len; i++) {
        if (str[i] == ' ') {
            for (j = i; j < len; j++) {
                str[j] = str[j + 1];
            }
            len--;
            i--; // 回退索引,避免跳过下一个字符
        }
    }
    str[len] = '\0'; // 更新字符串结束符

    // 转换为大写
    for (i = 0; str[i] != '\0'; i++) {
        if (islower(str[i])) {
            str[i] = toupper(str[i]);
        }
    }
    printf("加密后的消息(大写):");
    puts(str);

    // 生成加密数字(原逻辑:每个字符对应行和列)
    i = 0;
    k = 0;
    while (str[k] != '\0') {
        for (row = 0; row < 5; row++) {
            for (col = 0; col < 6; col++) {
                if (str[k] == array[row][col]) {
                    temparr[i] = '0' + row;
                    temparr[i + 1] = '0' + col;
                    i += 2;
                    break; // 找到匹配后退出内层循环
                }
            }
            if (str[k] == array[row][col]) {
                break; // 找到匹配后退出外层循环
            }
        }
        k++;
    }
    temparr[i] = '\0'; // 添加结束符

    // 按格式输出加密数字(将每两个字符拆分为一个数字,按空格分隔)
    printf("加密数字集:\n");
    for (i = 0; temparr[i] != '\0'; i += 2) {
        printf("%c%c", temparr[i], temparr[i+1]);
        if (i+2 < strlen(temparr)) {
            printf(" ");
        }
    }
    printf("\n");
}

void encryptmessage2(char array[][6])
{ 
    int i, j, loop, k =0, row, col;
    char key[80] = {};
    char temparr2[80] = {};                   // temporary array

    printf("Please enter your key : ");
    // 读取关键词,不再需要额外的getchar()
    while ((key[k] = getchar()) != '\n') {
        k++;
    }
    key[k] = '\0'; // 手动添加字符串结束符

    // 复制原关键词到临时数组
    strcpy(temparr2, key);

    // 转换为大写
    for (i = 0; key[i] != '\0'; i++) {
        if (islower(key[i])) {
            key[i] = toupper(key[i]);
        }
    }

    // 按格式输出大写关键词(字符间加空格)
    printf("\n关键词:\n");
    int key_len = strlen(key);
    for (i = 0; i < key_len; i++) {
        printf("%c", key[i]);
        if (i != key_len - 1) {
            printf(" ");
        }
    }
    printf("\n");

    // 示例输出模拟加密数据,需替换为实际加密逻辑
    int encrypted_key_data[4][7] = {
        {1,1,0,0,3,4,0},
        {3,4,5,6,3,2,5},
        {2,3,4,5,6,7,8},
        {2,3,4,3,2,4,5}
    };
    for (int row = 0; row < 4; row++) {
        for (int col = 0; col < key_len; col++) {
            printf("%d", encrypted_key_data[row][col]);
            if (col != key_len - 1) {
                printf(" ");
            }
        }
        printf("\n");
    }
}

内容的提问来源于stack exchange,提问作者XIz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 04:25:24