C++字符数组单词计数异常:计数器返回错误值求助
代码问题排查与修复
问题点分析
- 循环范围错误:你在
nameCount里固定循环30次(LENGTH值),但输入的有效字符串长度通常远小于这个数。数组未初始化的部分是随机垃圾值,这些值可能被误判为空格或'\0'导致计数器疯涨;如果垃圾值恰好都不匹配条件,就会出现计数器为0的异常。 - 统计逻辑错误:你现在统计的是空格和
'\0'的数量,这和单词数量完全不是一回事。比如输入“John Smith”,正确单词数是2,但你的逻辑会统计1个空格+1个'\0',再加上后面垃圾值的匹配项,结果完全不符合预期。
修复后的代码
#include <iostream> using namespace std; void nameCount(char[], int&); const int LENGTH = 30; int main() { char name[LENGTH]; int count = 0; cout << "Input full name: "; cin.getline(name, LENGTH); nameCount(name, count); cout << count; return 0; } void nameCount(char fullName[], int& count) { // 处理空输入的情况 if (fullName[0] == '\0') { count = 0; return; } // 非空输入至少有一个单词 count = 1; // 只遍历到字符串结束符,不处理垃圾值 for (int i = 0; fullName[i] != '\0'; i++) { // 遇到非连续、非结尾的空格时,单词数+1 if (fullName[i] == ' ' && fullName[i+1] != ' ' && fullName[i+1] != '\0') { count++; } } }
修复说明
- 把循环终止条件改成
fullName[i] != '\0',只处理输入的有效字符串部分,彻底避免垃圾值干扰。 - 调整统计逻辑:初始单词数设为1(非空输入至少有一个单词),只有遇到不是连续空格、且空格后还有有效字符时才增加计数,避免连续空格或结尾空格导致的错误统计。
- 增加空输入判断,确保输入为空时返回0。
内容的提问来源于stack exchange,提问作者Tobi
相关产品推荐
相关产品推荐

