C++For循环索引行为怪异(它从3而不是0开始)

C++ For Loop Index Acting Strange (It Starts at 3 Instead Of 0)

本文关键字:开始 它从 索引 循环 C++For      更新时间:2023-10-16

我正在尝试使用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()