C语言字符数组首字符丢失问题及加密数字排版需求
C语言加密程序修复:首字符缺失与格式排版优化
问题说明
- 输入关键词
cortina后,输出缺失首字符C,仅显示ortina - 需要将加密后的数字集按指定格式排版在大写关键词下方,示例如下:
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
相关产品推荐
相关产品推荐

