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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 14:24:02