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

为何我的for循环打印变量i会输出内存地址?USACO编程求助

问题分析与修复方案

核心问题拆解

1. 循环变量i的异常输出(注释代码的潜在bug)

你注释掉的内层循环存在致命错误:

for (int i = 0; i < stringA.length(); i++) 
{
    for (int j = 0; j < 26; i++)  // 错误:这里应该是j++,不是i++
    {
        if (stringA[i] == foo[j])
        {
            doo[j] += 1;
        }
    }
}

内层循环错误地递增i而非j,会导致i持续溢出,不仅越界访问字符串,还会覆盖外层循环的i变量,最终打印出异常值。

2. 程序末尾输出内存地址

代码最后一行cout << doo;中,doo是数组名,在C++中数组名会隐式转换为指向数组首元素的指针,直接输出指针就会打印内存地址——这就是你看到每次输出不同的原因。

修复后的完整代码

#include <fstream>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main()
{
    ifstream fin("blocks.in");
    ofstream fout("blocks.out");

    int n = 0;
    fin >> n;
    cout << n << endl;
    
    char foo[26] = { 'a', 'b', 'c' , 'd' , 'e' , 'f' , 'g' , 'h' , 'i' , 'j' , 'k' , 'l' , 'm' , 'n' , 'o' , 'p' , 'q' , 'r' , 's' , 't' , 'u' , 'v' , 'w' , 'x' , 'y' , 'z' };
    int doo[26] = { 0 }; // 简化初始化
    string stringA, stringB; // 无需初始值,输入会直接覆盖

    for (int i = 0; i < n; i++)
    {
        fin >> stringA >> stringB;
        string combined = stringA + stringB; // 用临时变量存合并结果,避免修改原字符串
        
        sort(begin(combined), end(combined));
        auto last = unique(begin(combined), end(combined));
        combined.erase(last, end(combined));
        
        cout << i << "\n";
        
        // 修复内层循环逻辑
        for (char c : combined) {
            for (int j = 0; j < 26; j++) {
                if (c == foo[j]) {
                    doo[j] += 1;
                    break; // 找到对应字母后直接跳出,提升效率
                }
            }
        }
    }

    // 正确输出数组内容到控制台
    for (int count : doo) {
        cout << count << " ";
    }
    cout << endl;

    // 输出到题目要求的输出文件
    for (int count : doo) {
        fout << count << endl;
    }

    fin.close();
    fout.close();
    return 0;
}

额外优化点

  • 无需初始化stringA和stringB为"d",输入语句会直接覆盖原有值。
  • 用临时变量combined存储合并后的字符串,逻辑更清晰,避免污染原输入字符串。
  • 使用范围for循环遍历字符,代码更简洁易读。
  • 找到对应字母后添加break,减少不必要的循环迭代。
  • 补充了输出到blocks.out文件的逻辑,符合USACO题目的输出要求。

内容的提问来源于stack exchange,提问作者kate

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 22:01:07