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

标签 c graph strtok

我正在为 C 语言的算法类(class)做期末项目。对于该项目,我们必须采用包含以下行的输入文本文件:

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...

最佳答案

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

在将它传递给(或传入)add_vertex 之前,您需要 strdup(token1)

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

关于c - 所有对象都具有相同的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6619833/

相关文章:

c - 如何将 C 代码转换为汇编的十六进制表示形式?

使用动态编程进行字符串操作

c - 将字符串拆分为标记

c - 调用 fgets 从文件中读取行时出现段错误

c - 使用 strtok() 将字符串分成 3 部分

c - 在 OS X 中获取 CPU 拱形字符串(C、Cocoa)

c - 如何确定连接是否使用 apache2 httpd 模块的加密/SSL?

c - 触摸板驱动程序

c++ - boost 图 CRS : bulk weights and Dijkstra

python - 使用networkx在Python中以graph6格式保存图形