C++如何统计字符串sentence的单词数,类成员函数实现相关疑问
问题解答
返回统计结果的变量选择
你代码中定义的word变量本身就是用来累计单词数量的,直接返回这个变量即可。但你现有代码的else分支存在逻辑错误:只要遇到非字母字符就直接return 0,这会导致字符串里只要出现空格、数字、标点等非字母内容,就会直接终止统计返回0,完全不符合单词统计的实际需求。
是否需要手动自增i移动字符
不需要,你使用的for (i = 0; sentence[i] != '\0'; i++)循环已经设定了每次循环结束后自动执行i++遍历下一个字符,你在循环内部多次手动写i++会导致大量字符被跳过,甚至可能访问到字符串结束符\0之后的非法内存,触发未定义行为。
修正后的代码参考
单词统计的核心逻辑是检测「新单词的起始位置」:当当前字符是字母,且前一个字符不是字母(或处于字符串开头)时,才给单词计数+1,避免重复计数:
int Directive::words(const char* sentence) { int i, word = 0; // 标记当前是否处于单词内部 bool in_word = false; for (i = 0; sentence[i] != '\0'; i++) { // 判断当前字符是不是字母 bool is_alpha = (sentence[i] >= 'a' && sentence[i] <= 'z') || (sentence[i] >= 'A' && sentence[i] <= 'Z'); if (is_alpha) { if (!in_word) { // 刚进入一个新单词,计数+1 word++; in_word = true; } } else { // 遇到非字母,标记不在单词内部 in_word = false; } } return word; }
内容的提问来源于stack exchange,提问作者Yanru Shin
相关产品推荐
相关产品推荐

