2013-05-06 54 views
-3

所以我有這個程序,我把頭從頭放在一起c。它來自第6章 - 數據結構章節......我的問題是輸出顯示了所有以前列出的條目以及最後輸入的標準輸入名稱。所以相反,當程序打印幾乎所有東西時,顯示一切打印出來我很難形容。如果你只是複製並粘貼到你的機器上的文本編輯器並運行代碼,你會明白我的意思。c程序不按預期輸出

這本書展示了使用<重定向工具獲取島名文件的程序。當我嘗試這個時,它打印第一個名字的第二個名字和第一個名字。然後是下一個名字和第二個名字......然後是下一個名字和第三個,第二個和第一個名字......等,取決於有多少名字。在標準輸入中的終端中輸入文本時也會發生此行爲。

如果我更改了代碼說顯示器(下)它的工作原理接近我所期望的,但它仍然打印出一個額外的空白行,有可能是內存泄漏

此代碼是相當多了我的頭可以找出爲什麼它是這樣打印?

我會先問c討論板的頭部,但我想先問stackoverflow並立即得到答案。

我的代碼如下。如果您將其複製並粘貼到文本編輯器中,它不應該看起來像一堵文字牆。

快樂編碼。

#include <stdio.h> // basic input output 
#include <stdlib.h> // for obtaining and releasing heap memory malloc and free... 
#include <string.h> // for the stringdup method 

typedef struct island { 
    char *name; 
    char *opens; 
    char *closes; 
    struct island *next; 
} island; 

void display(island *madonna); 

island* create(char *name); 

void release(island *start); 

int main() 
{ 
    /* create islands */ 
    island *start = NULL; 
    island *i = NULL; 
    island *next = NULL; 
    char name[80]; 
    puts("enter island name..."); 
    for(; fgets(name, 80, stdin) != NULL; i = next) { 
     next = create(name); 
     if(start == NULL) 
      start = next; 
     if (i != NULL) 
      i -> next = next; 

     display(start); 

    } 
    release(start); 

} 

// display method 
void display(island *start) 
{ 
    island *i = start; 

    if (i == NULL) 
     puts("i equals NULL "); 

    for(;i != NULL; i = i ->next) { 
     printf("Name: %s open: %s-%s\n", i->name, i->opens, i->closes); 
    } 
} 

// create method 
island* create(char *name) 
{ 
    island *i = malloc(sizeof(island)); 
    i->name = strdup(name); 
    i->opens = "09:00"; 
    i->closes = "17:00"; 
    i->next = NULL; 
    return i; 
} 

// release method 
void release(island *start) 
{ 
    island *i = start; 
    island *next = NULL; 
    for(; i != NULL; i = next) { 
     next = i-> next; 
     free(i->name); // must free this first because of strdup uses heap memory 
     free(i); 
    } 
} 
+0

你需要做'display(i);'而不是'display(start);' – 2013-05-06 05:25:49

+0

...或者將'display()'移到循環之外。 – WhozCraig 2013-05-06 05:27:52

+0

我不能相信有人標記了這個問題。無論如何感謝迄今爲止的幫助。 @WhozCraig如果我將display()從循環中移出,程序只是在那裏進行輸入,但實際上並沒有顯示任何內容...... – 2013-05-06 05:33:52

回答

1

什麼代碼工作,爲設計(WAD)。它被設計爲在每個條目被讀取後打印完整列表 - 這就是display(start)在循環中所做的。您可以通過回顯輸入(printf("Read: %s", name);(格式中沒有換行符,因爲該名稱仍包含換行符)或在012xx(或兩者)調用之前用printf("Printing list:\n");標記顯示)來幫助自己。如果您從名稱中刪除換行符,則需要調整「回顯」操作。

學習如何創建有用的診斷消息是一種有價值的技術;其中一個關鍵點是確保輸出行以換行符結束,因此您可以很好地看到打印的發生,而不是稍後的某個不確定時間。另一個關鍵點是打印輸入,以便您知道代碼的工作內容,而不是認爲您知道代碼的工作內容。在每次迭代中打印完整列表還有助於確保正確構建列表。您可以在SO上找到列表未正確構建的示例(例如First address of struct)。如果每次迭代都打印完整列表,問題就會更加明顯。

因此,麻煩似乎是您的期望與代碼設計的目標不符。

+0

如果我在main()的for循環中更改要顯示(下一個)的代碼,它只會打印上次輸入的內容或使用<重定向的名稱文件的全部內容。我的名字文件是一個名字,然後返回然後另一個島名,等等,如果我移動顯示(下一步)和釋放(開始)到main()的for循環,我得到一個無限循環與第二個島名打印到無窮.. – 2013-05-06 06:17:38

+0

我不認爲這真的回答了什麼,但我很沮喪,我讚賞@Jonathan – 2013-05-06 06:20:45

0

「我的問題是,輸出顯示所有以前列出的條目作爲 以及最後輸入的名稱爲標準輸入。」

for(;i != NULL; i = i ->next) { 
     printf("Name: %s open: %s-%s\n", i->name, i->opens, i->closes); 

順便說一下,你告訴我們你的問題,但你沒有告訴我們,你的程序應該做

+0

已經在顯示方法中有這樣的代碼...有沒有人嘗試複製和粘貼,然後在他們的機器上運行代碼? – 2013-05-06 05:42:28

+0

有問題。我不需要複製粘貼你的代碼。只要閱讀它,拿一紙或任何東西,想想你寫的是什麼。在你的程序中有2個循環 – axzwl 2013-05-06 05:45:26

+0

答案沒有回答任何問題... – 2013-05-06 06:11:02