如何编写C语言程序统计下划线间字符数?程序异常问题求助
解决C语言统计下划线间字符数的问题
你的代码在处理无下划线结尾的字符串时出错,核心问题有两个:
password_numbers函数遍历完字符串未遇到下划线时返回0,而非实际字符数array_password_numbers的循环逻辑会重复处理无效位置,导致填充大量冗余0
修改后的代码
1. 修复password_numbers函数
int password_numbers(const char *s){ int count = 0; // 直接判断字符结束符,避免循环内反复调用strlen提升效率 for(int i = 0; s[i] != '\0'; i++) { if(s[i] != '_') { count++; } else { return count; } } // 遍历完未遇到下划线,返回累计的字符数(原逻辑返回0是错误根源) return count; }
2. 修复array_password_numbers函数
int array_password_numbers(int *a, int n, char *s){ int result = 0; int i = 0; // 提前计算字符串长度,避免循环内重复调用strlen int len = strlen(s); while( i < len ){ int streak = password_numbers(s + i); a[result++] = streak; // 仅当当前段后是下划线时,才跳过下划线继续处理;否则直接结束循环 if(i + streak < len && s[i + streak] == '_'){ i += streak + 1; } else { break; } } return result; }
修改说明
password_numbers调整:- 循环条件改为直接判断字符串结束符,避免每次循环调用
strlen(strlen会遍历整个字符串,效率低下) - 遍历完成未遇到下划线时,返回累计的字符数,而非0,解决了无下划线输入返回0的问题
- 循环条件改为直接判断字符串结束符,避免每次循环调用
array_password_numbers调整:- 提前计算字符串长度,减少重复计算
- 增加判断逻辑:仅当前段后续字符是下划线时,才移动指针到下划线后继续处理;否则直接退出循环,避免了无效位置的重复处理,消除了冗余0的输出
经过上述修改后,四个测试场景均可得到正确输出:
- 输入
"All_I_Need_"→ 输出3 1 4 - 输入
"All_I_Need"→ 输出3 1 4 - 输入
"All_"→ 输出3 - 输入
"All"→ 输出3
内容的提问来源于stack exchange,提问作者Pirata8700
相关产品推荐
相关产品推荐

