2011-07-08 74 views
1

我在做我最後的項目我的算法課程C.對於這個項目,我們必須採取一個包含像行輸入文本文件:所有對象具有相同的名稱

P|A|0 

E|0|1|2 

前者表示要添加到我們在程序中使用的圖形的頂點,第2個標記是頂點的名稱,最後一個標記是它在圖的頂點[]數組中的索引結構。

我有一個逐行循環的程序,它需要第一個標記來決定是創建一個頂點還是一個邊,然後相應地繼續。

當我完成文件遍歷時,我打電話給我的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... 
+0

有很多它,我不確定什麼是相關的張貼在這裏。 – btzmacin

+0

這還不夠清楚。標記是什麼意思的方式? – longbkit

+0

@Dhaivat說了些什麼,儘管有些人(不是我)可能會反對他的措辭,這是正確的。沒有看到你的一些代碼,我們無法幫助你。但是,儘量避免將所有代碼傾倒在我們身上。嘗試將其縮小到一個最小的例子,以展示您遇到的相同錯誤/問題。你可能會以這種方式解決它,如果你不能,我們一定會有更容易的時間幫助你。 –

回答

2

你是不是複製的名字。所以你最終得到一個指針(由strtok返回)到單個靜態數組中,你在其中讀取每一行。由於該名稱始終位於偏移量2,因此該指針始終爲currLn+2。當你遍歷和打印時,這將是你讀的最後一個名字。

在傳遞到(或在)add_vertex之前,您需要strdup(token1)

不,沒有足夠的信息來確定這是答案。但我會打賭這就是它。

+0

是啊,這是我在想什麼。我犯了這個錯誤之前:( – Matt

+0

所以而不是add_vertex(g,token1)...我應該做add_vertex(g,strdup(token1))? – btzmacin

+0

我的父母和我的GPA感謝你! – btzmacin

相關問題