C++统计句子最长单词长度的代码运行中途停止,如何排查原因?
运行卡住的根本原因
- 死循环漏洞:当遍历到空格或者字符串结束符
\0时,代码仅更新了长度统计值,没有对遍历下标i执行递增操作,会一直停留在当前位置重复判断,永远无法推进遍历也无法跳出循环。 - 结束逻辑失效:字符串结束符
\0的判断被放在了else分支,而a[i] == '\0'已经被第一个if条件捕获,永远不会触发else分支里的break语句,就算走到字符串末尾也不会结束循环。 - 其他潜在问题:
char a[n+1]是C语言的可变长度数组特性,不属于C++标准语法,部分编译器会编译失败;cin.getline(a,n)执行后额外调用的cin.ignore()属于冗余操作。
修复后可正常运行的代码
#include<iostream> using namespace std; int main(){ int n; cin>>n; cin.ignore(); // 改用动态分配数组符合C++标准,也可直接用std::string简化实现 char* a = new char[n+1]; cin.getline(a, n+1); int i=0; int currLen=0, maxLen=0; while(true){ if(a[i]==' ' || a[i]=='\0'){ if(currLen>maxLen){ maxLen=currLen; } currLen=0; // 匹配到结束符直接跳出循环 if(a[i] == '\0'){ break; } // 空格场景下标后移,避免死循环 i++; } else{ currLen++; i++; } } cout<<maxLen<<endl; delete[] a; return 0; }
核心修改说明
- 空格匹配分支新增
i++,确保遍历正常推进不会卡住 - 结束符判断和break逻辑移到if分支内,确保走到字符串末尾可以正常终止循环
- 替换可变长度数组为动态内存分配写法,符合C++标准,兼容性更强
- 调整
cin.getline传入长度为n+1,匹配数组实际容量可以完整读取输入 - 移除冗余的
cin.ignore()调用
内容的提问来源于stack exchange,提问作者Smartphone Wallpapers
相关产品推荐
相关产品推荐

