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

C++逻辑错误排查:金额转语音无法插入‘CENTAVOS’单词问题咨询

金额转葡萄牙语语音描述的逻辑错误排查与修复

问题概述

现有C语言代码用于将金额数字转换为葡萄牙语语音描述,存在无编译警告的逻辑错误:当启用decoder_cardinal(voz.centavos)语句时,最终输出的ditado6无法正确插入“CENTAVOS”单词;禁用该语句时则可正常插入。

核心错误点分析

问题根源在insere_caracter函数的循环逻辑中,原代码片段如下:

bool insere_caracter(const char *digito[],int indice){
   voz.ditado[voz.posicao]=' '; //espaço inicial
   unsigned int az;
   char str[33];
   strcpy(str,digito[indice]);   //CHANGE FOR BELOW
      //for(az=0;az<strlen(str);az++   
      for(az=0;az<=strlen(str);az++){
        voz.ditado[++voz.posicao]= digito[indice][az];
      }//for az
   return true;
}

关键错误:

  • 循环条件使用az <= strlen(str),会导致循环额外执行一次,将字符串的结束符\0写入voz.ditado数组中。
  • 当decoder_cardinal(voz.centavos)执行后,voz.ditado中提前出现了\0,后续插入“CENTAVOS”的操作会因为遇到终止符而无法追加到有效字符串区域,最终表现为“CENTAVOS”未被插入。
  • 多余的strcpy操作完全可以省略,直接使用原字符串指针即可。

修复方案

修改循环条件为az < strlen(str),同时优化代码避免重复计算字符串长度,修复后的函数代码如下:

bool insere_caracter(const char *digito[], int indice) {
    voz.ditado[voz.posicao] = ' '; // 初始空格
    unsigned int az;
    const char *target_str = digito[indice];
    size_t str_len = strlen(target_str);
    // 仅遍历字符串的有效字符,不包含结束符
    for (az = 0; az < str_len; az++) {
        voz.ditado[++voz.posicao] = target_str[az];
    }
    return true;
}

输出验证

错误输出(修复前)

Inteiro:123 
Fracionario:11 
ditado1:' CEM VINTE TRES REAIS' 
posicao 00:20 
ditado2:' CEM VINTE TRES REAIS E ' 
posicao 01:23 
posicao 02:28 
ditado3:' CEM VINTE TRES REAIS E ONZE' 
posicao 05:36 
ditado6:' CEM VINTE TRES REAIS E ONZE' //此处未插入“CENTAVOS”
posicao 06:36 

正确输出(修复后,符合预期)

Inteiro:123 
Fracionario:11 
ditado1:' CEM VINTE TRES REAIS' 
posicao 00:20 
ditado2:' CEM VINTE TRES REAIS E ' 
posicao 01:23 
posicao 02:28 
ditado3:' CEM VINTE TRES REAIS E ONZE' 
posicao 05:36 
ditado6:' CEM VINTE TRES REAIS E ONZE CENTAVOS' 
posicao 06:36

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 23:15:36