为何我的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
相关产品推荐
相关产品推荐

