You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

统计字符串单词数的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 12:12:38