统计字符串单词数的C++代码偶发out of range错误原因咨询
你的单词统计代码触发"out of range"错误的原因分析
嗨,咱们来拆解一下你这段代码里导致越界错误的核心问题,顺便给你指几个其他的逻辑小漏洞:
1. 直接触发异常的致命逻辑
你代码里的while循环是问题的根源:
while (str.at(i) != ' ') { i++; if (str.at(i) == str.length()) { break; } }
这里有两个完全错误的地方:
- 终止条件完全无效:
str.at(i)是获取字符串第i位的字符,而str.length()是字符串的长度(一个数字)。你拿字符的ASCII值和长度数值做比较,这完全是风马牛不相及,这个break永远不会被触发。 - 下标越界触发异常:当循环到字符串的最后一个非空格字符时,
i++会把i的值推到等于str.length()的位置(别忘了字符串的下标是从0到length()-1的),这时候再调用str.at(i),就会直接抛出out_of_range异常——因为at()方法会严格检查下标合法性,超出范围就会报错。
2. 其他潜在的逻辑漏洞
除了致命的越界问题,代码还有些小问题:
- 连续空格处理不当:
if (str.at(i) == ' ') { i++; }加上循环本身的i++,会跳过两个空格,但如果有三个及以上连续空格,还是会出现计数错误。 - 未处理开头/结尾空格的情况:比如字符串开头是空格,或者结尾是非空格字符时,要么计数不准,要么会触发越界。
修复后的代码示例
给你一个更安全可靠的版本,用状态标记的方式统计单词,完全避免下标操作的越界问题:
#include <iostream> #include <string> using namespace std; int main() { string str; getline(cin, str); int count = 0; bool is_in_word = false; // 遍历每个字符,用状态标记判断是否进入单词 for (char c : str) { if (c != ' ') { if (!is_in_word) { count++; is_in_word = true; } } else { is_in_word = false; } } cout << "number of words are : " << count << endl; return 0; }
这个版本可以正确处理连续空格、开头/结尾空格的情况,而且不会出现下标越界的问题。
内容的提问来源于stack exchange,提问作者Rohit Rawat
相关产品推荐
相关产品推荐

