C++For循环索引行为怪异(它从3而不是0开始)
C++ For Loop Index Acting Strange (It Starts at 3 Instead Of 0)
我正在尝试使用for循环打印一个表示Graph节点和边权重的矩阵。第一行之后的所有行都按预期工作,但列的节点名称的打印行为非常奇怪,在尝试了多种不同的方法后,我完全迷失了方向。这是"被窃听"的代码和输出。
代码:
void Graph::print_graph_matrix(void)
{
std::cout << "n";
int i, j;
for(i = 0; i < nodes.size(); i++)
{
std::cout << "t" << nodes[i];
}
std::cout << "n";
for(i = 0; i < nodes.size(); i++)
{
std::cout << nodes[i];
for(j = 0; j < nodes.size(); j++)
{
std::cout << "t" << edges[i][j];
}
std::cout << "n";
}
}
输出:
D
A 0 0 0 0
B 0 0 0 0
C 0 0 0 0
D 0 0 0 0
但是,最上面的列标签应该打印
A B C D
当我尝试在代码中调试它时(通过打印出I本身的值),第一次打印出来时,它打印出的是3,而不是0,我的目标起始索引。
我从来没有见过这样的事情,请帮我了解这里发生了什么。非常感谢。
编辑:我的代码的其他部分正在被要求,因为这可能在其他地方发生。
Main:
int main()
{
clear_screen();
int graph_num;
std::string filename;
std::cout << "How many graphs would you like to create?n";
std::cin >> graph_num;
std::cin.ignore();
std::fstream files[graph_num];
Graph * graphs[graph_num];
for(int k = 0; k < graph_num; k++)
{
graphs[k] = new Graph();
std::cout << "nEnter the name of file " << k+1 << " to read: ";
std::cin >> filename;
std::cin.ignore();
files[k].open(filename.c_str());
if(files[k].fail())
{
std::cout << "nError opening file '" << filename << "'...n";
return -1;
}
else
{
std::cout << "nSuccess opening '" << filename << "'!nSetting graph...n";
graphs[k]->set_graph(files[k]);
graphs[k]->print_graph_matrix();
}
}
for(int j = 0; j < graph_num; j++)
{
files[j].close();
}
}
set_graph函数:
void Graph::set_graph(std::fstream &fin)
{
std::string line;
std::vector<int> row;
while(getline(fin, line))
{
if(isBlank_str(line))
{
std::cout << "Nodes read in successfully!n";
break;
}
else
{
nodes.push_back(line);
node_num++;
}
}
while(getline(fin, line))
{
//set edges here
edge_num++;
if(fin.eof())
break;
}
//initialize an empty row
for(int i = 0; i < node_num; i++)
{
row.push_back(0);
}
//push back empty rows
for(int j = 0; j < node_num; j++)
{
edges.push_back(row);
}
}
示例数据文件(由教授提供):
A
B
C
D
A B 3
A C 10
A D 12
B C 1
B D 14
C D 4
我知道这段代码有点草率,因为它只是我项目的开始,但我总是会被我遇到的每一个错误所困扰,直到我能修复它。我从来没有见过这样的事情,所以我感谢yall的时间和帮助!
@n.m建议我检查输入数据文件中的'\r'字符,正如他预测的那样,在我的向量中,我的字符串中确实有这些字符,这导致了故障,覆盖了终端的输出。
为了解决这个问题,我添加了一行:
line.erase(line.size()-1);
然后它完美地工作了!
我重新创建了上面程序的一个简单示例,例如:
#include <vector>
#include <iostream>
#include <iomanip>
class Graph {
public:
std::vector<char> nodes { 'A', 'B', 'C', 'D' };
unsigned edges[4][4] { { 00, 01, 02, 03 },
{ 10, 11, 12, 13 },
{ 20, 21, 22, 23 },
{ 30, 31, 32, 33 } };
void print_graph();
};
void Graph::print_graph() {
std::cout << "n";
unsigned i, j;
for ( i = 0; i < nodes.size(); i++ ) {
std::cout << "t" << std::setw(2) << nodes[i];
}
std::cout << "n";
for ( i = 0; i < nodes.size(); i++ ) {
std::cout << nodes[i];
for ( j = 0; j < nodes.size(); j++ ) {
std::cout << "t" << std::setfill( '0' ) << std::setw(2) << edges[i][j];
}
std::cout << "n";
}
}
int main() {
Graph g;
g.print_graph();
return 0;
}
我得到控制台的以下输出:
A B C D
A 00 01 02 03
B 10 11 12 13
C 20 21 22 23
D 30 31 32 33
根据你提供的代码,我可以判断;应该没有错误。这个bug很可能来自您所展示内容之外的某个地方。与我的输出显示器的唯一区别是我使用了std::setw()
&std::setfill()
用于与控制台对齐。
一个没有提到的罪魁祸首:
j < nodes.size()
应该是
j < edges[i].size()
相关文章:
- 如何从C++中的依赖类型中获得它所依赖的类型
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 数组长度,为什么从命令行获取时不能使用它?
- 使用 pqxx 将 std::vector 存储在 postgresql 中,并从数据库中检索它
- C++需要帮助从用户那里获得一个整数,并确保它在另外两个整数之间
- 为什么 -mmacosx-version-min=10.10 不阻止使用标记为从 10.11 开始的函数?
- 将 C++ 类与 Rcpp 一起使用,从 C 或 R 修改它
- 当我从下面的代码中删除关键字 virtual 时,它可以正常工作,否则会出现错误。在这里"virtual"字的意义是什么?
- 如何从QFile阅读?它显示该文件不可访问
- 我看过Stellarium代码,我不知道它从哪里开始
- 试图打开并读取一个.txt文件,但它从原始文件中删除了实际文本(Qt GUI C++
- 为什么我的结果中有 0?我不知道它从哪里来
- 包含字符串的类:当它从函数返回时会发生什么?
- 类是否可以在其构造函数的参数中设置它从另一个类继承的变量的值
- C++For循环索引行为怪异(它从3而不是0开始)
- 有没有有效的方法可以从现在开始生成从范围到 10 天的随机date_time
- C++:int64_t它从何而来
- 按文本搜索一行并在文本文件中删除它(从C#到C++/CLI)
- 为什么它从地图中给出了随机值
- 如何声明二维数组的对象和返回它从一个函数