C语言按指定字母映射替换字符串字符代码输出错误修复求助
问题原因与修复方案
错误根因
代码输出不符合预期主要是两个问题导致的:
- 匹配到对应小写字母后没有跳出内层循环,替换后的字符会被后续的遍历逻辑再次匹配替换。比如小写a匹配到j=0替换为q后,j继续向后遍历,当遍历到字母q对应的下标时,会再次把当前已经替换成q的字符替换为置换表中q位置对应的字符,经过多次替换后自然得到错误的结果。
- 内层循环的终止条件错误,
j < (strlen(alphabet) - 1)会跳过字母表最后一位z的匹配,要覆盖全部26个小写字母,应该去掉减1的逻辑。
修复后的代码
保留原有双层循环逻辑的修复版本
#include <stdio.h> #include <string.h> #define MAX_STR_LEN 256 int main(void) { char perm[] = "qjczieaungsdfxmphybklortvw"; char alphabet[] = "abcdefghijklmnopqrstuvwxyz"; int i, j; char msg[MAX_STR_LEN+1]; fgets(msg, MAX_STR_LEN, stdin); for (i = 0; i < strlen(msg); i++) { for (j = 0; j < strlen(alphabet); j++) { if (msg[i] == alphabet[j]) { msg[i] = perm[j]; break; // 匹配成功后立即跳出内层循环,避免多次替换 } } } printf("%s", msg); return 0; }
更高效的优化版本
不需要双层循环比对,直接通过ASCII码计算下标即可,时间复杂度从O(n*26)降到O(n):
#include <stdio.h> #include <string.h> #include <ctype.h> #define MAX_STR_LEN 256 int main(void) { char perm[] = "qjczieaungsdfxmphybklortvw"; int i; char msg[MAX_STR_LEN+1]; fgets(msg, MAX_STR_LEN, stdin); for (i = 0; i < strlen(msg); i++) { // 仅处理小写字母 if (islower(msg[i])) { msg[i] = perm[msg[i] - 'a']; } } printf("%s", msg); return 0; }
两个版本都可以实现需求:输入abcxyz输出qjctvw,输入Abc输出Ajc。
内容的提问来源于stack exchange,提问作者Dominic Jk
相关产品推荐
相关产品推荐

