C语言count_sentences函数无法正确统计多个句子结束符问题
问题原因
strcmp的作用是比较两个以\0为终止符的完整字符串,传入&text[i]作为参数时,函数会从下标i的位置一直遍历到字符串末尾做整串比对,而非仅比较当前位置的单个字符。
只有当i刚好是字符串最后一个字符的下标,且该字符为?/!/.三者之一时,从i位置开始的子串才会和长度为1的比较目标完全相等,触发计数,这就是代码无论包含多少个结束符最多只计1次、且仅末尾是结束符才计数的核心原因。
另外当前循环每一轮都调用strlen计算字符串长度,strlen本身需要从头遍历字符串到终止符才能返回结果,长文本场景下会产生不必要的性能损耗。
修复方案
单字符判断不需要调用字符串比较函数,直接取当前下标位置的字符值和目标字符比对即可,同时可以提前计算一次字符串长度复用,避免重复计算。
修正后的代码如下:
int count_sentences(string text) { int count = 0; int text_len = strlen(text); for (int i = 0; i < text_len; i++) { char cur = text[i]; if (cur == '?' || cur == '!' || cur == '.') { count += 1; } } return count; }
可选优化
如果需要处理连续多个结束符(例如Hi!! How are you??)重复计数的场景,可以额外加一层判断,仅当前一个字符不是结束符时,才对当前位置的结束符计数,避免把连续标点算成多个句子。
内容的提问来源于stack exchange,提问作者Nour11
相关产品推荐
相关产品推荐

