C ++ For Loop Index Acting Strange(从3开始而不是0)

时间:2017-10-18 02:16:48

标签: c++ loops for-loop

我正在尝试使用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,我的目标起始索引。

我从未见过这样的事情,请帮助我了解这里发生了什么。谢谢!

编辑: 我的代码的其他部分正在被要求,因为这可能发生在其他地方。

主:

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

我知道这段代码有些草率,因为它只是我项目的开始,但我总是倾向于遇到我遇到的每一个错误,直到我能解决它。我从未见过这样的事情,所以我很感激你们的时间和帮助!

3 个答案:

答案 0 :(得分:1)

@牛米。建议我检查&#39; \ r&#39;输入数据文件中的字符,正如他所预测的那样,确实有这些字符位于我的向量中的字符串中,这导致了终端的错误,覆盖输出。

为了解决这个问题,我添加了一行:

line.erase(line.size() - 1);

然后它完美无缺!

答案 1 :(得分:0)

我在上面重新创建了一个简单的程序示例,例如:

#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

从你所提供的代码我所知道的;应该没有错误。这个错误很可能来自你所展示的之外的某个地方。我输出显示的唯一区别是我使用了std::setw()&amp; std::setfill()用于与控制台对齐。

答案 2 :(得分:0)

没有提到的罪魁祸首:

j < nodes.size()

应该是

j < edges[i].size()