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
相关产品推荐
相关产品推荐

