所有对象都具有相同的名称

时间:2011-07-08 04:02:41

标签: c graph strtok

我正在为C中的算法课程做最后的项目。对于项目,我们必须采用包含以下行的输入文本文件:

P|A|0

E|0|1|2

前者表示要添加到我们在程序中使用的图形的顶点,第二个标记是顶点的名称,最后一个标记是图形结构的vertices []数组中的索引。

我有一个while循环逐行遍历这个程序,它需要第一个标记来决定是创建顶点还是边缘,然后相应地继续。

当我完成文件遍历时,我调用了show_vertices函数,它只是一个for循环,按顺序打印每个名称(g-> vertices [i] .name)。

问题是名称应该放在输出(%s)中,我不断收到我收集的最后一个“token1”。在我正在使用的特定输入文件的情况下,恰好是列表中最后一个边缘的源节点...这是奇数,因为之后有两个其他值通过strtok()函数传递。文件中的行如下所示:

E|6|7|1

从索引6到7创建一个边,权重为1.边缘正常。但是当我用%s调用任何printf时,它会出现“6”。无论。

这是文件遍历。

fgets(currLn, sizeof(currLn), infile);
maxv = atoi(currLn);
if(maxv = 0)
{
    //file not formatted correctly, print error message
    return;
}

t_graph *g = new_graph(maxv, TRUE);

while((fgets(currLn, sizeof(currLn), infile)) != NULL)
{
    token1 = strtok(currLn, "|");
    key = token1[0];

    if(key == 'P' || key == 'p')
    {
        token1 = strtok(NULL, "|");
        if(!add_vertex(g, token1))
        {
            //file integration fail, throw error!
            return;
        }
        //***If I print the name here, it works fine and gives me the right name!****
        continue;
    }
    if(key == 'E' || key == 'e')
    {
        token1 = strtok(NULL, "|");
        token2 = strtok(NULL, "|");
        token3 = strtok(NULL, "|");
        src = atoi(token1);
        dst = atoi(token2);
        w = atoi(token3);

        if(!add_edge(g, src, dst, w))
        {
            //file integration fail, throw error
            return;
        }
        continue;
    }
    else
    {
        //epic error message because user doesn't know what they're doing.
        return;
    }
}

如果我在这里运行show_vertices,我会得到:

0. 6  
1. 6  
2. 6  
etc...

1 个答案:

答案 0 :(得分:2)

您没有复制名称。因此,您最终得到一个指针(由strtok返回)到单个静态数组,您可以在其中读取每一行。由于名称始终位于偏移量2处,因此该指针始终为currLn+2。当您遍历和打印时,这将是您阅读的姓氏。

在将strdup(token1)传递给(或在add_vertex之前,您需要{{1}}。

没有足够的信息可以确定这是答案。但我敢打赌这就是它。