2014-03-31 66 views
0

我想在名爲insert的函數中插入字符串到struct data_node。我struct data_node如何在鏈接列表插入函數中插入字符串

struct data_node { 
    char name [25]; 
    int data; 
    struct data_node *next; 
    }; 

和我的插入功能是:

struct data_node * insert (struct data_node **p_first, int elem, char *word) { 

    struct data_node *new_node, *prev, *current; 
    current=*p_first; 
    while (current != NULL && elem > current->data) { 
     prev=current; 
     current=current->next; 
    } /* end while */ 

    /* current now points to position *before* which we need to insert */ 
    new_node = (struct data_node *) malloc(sizeof(struct data_node)); 
    new_node->data=elem; 
    new_node->name=*word; 

    new_node->next=current; 
    if (current == *p_first) /* insert before 1st element */ 
     *p_first=new_node; 
    else      /* now insert before current */ 
     prev->next=new_node; 
    /* end if current == *p_first */ 
    return new_node; 
}; 

當我編譯,它說,分配給類型從類型「字符」「的char [25]」當行22不兼容的類型這意味着new_node->name=*word;是錯誤的。我怎麼能解決這個問題?

+0

哦,這是我想要的,謝謝! – user3023835

回答

1

鏈接列表結構是不相關的。這個問題歸結爲將一個char[]複製到另一個。這將工作:

strncpy(new_node->name, word, 25); 

有一些注意事項。如果word未指向有效的char[],則可能會導致未定義的行爲。如果它指向一個包含多於25個或更多(非空)字符的數組,則操作會將前25個複製到new_node->name,這意味着new_node->name而不是以空終止,這可能會導致以後出現問題如果其他代碼假定它是。 正如WhozCraig指出的那樣,通過複製少於一個字符的字符(例如25-1),確保爲它留出空間之後,終止目標字符串爲空幾乎總是一個好主意。你可能會考慮定義一個常量NAMELENGTH,這樣你的代碼中就不會出現幻數25。

+0

無終止警告不只是如果源字符串超過25個非空字符,其*至少* 25個字符。意思是一個字符串*精確* 25個字符長,不只是長於25,同樣會*不終止*。這是編碼截斷驗收時使用小於目標緩衝區長度作爲長度參數的原因,並且* always *將緩衝區中的最後一個字符硬化爲0.如果字符串較短,則硬件集是良性的(事實上,在這種情況下,緩衝區的整個尾部已經被清零)。 – WhozCraig

+0

@WhozCraig:1)你是對的,我是一個接一個的。 2)你稍微不對;儘管不是絕對必要的,但將最後一個字符設置爲0是我應該提到的一個很好的約定。我將編輯... – Beta

+0

如果手動終止字符串並且被複制的字符串是N長度,其中N是strncpy()的第三個周長,它將*不*終止字符串。設置終止符不是可選的;它的*強制*,特別是在OP的情況下,緩衝區關閉了一個新的malloc,因此充滿了不確定的數據。如果緩衝區不是「calloc」,那麼它當然是可選的,但只有當「25-1」(即24)或更短時間才作爲長度。 – WhozCraig

0

data_node.data應該是void *。這樣你可以存儲任何類型的數據(雖然在閱讀時你必須知道它是什麼類型)。

0

您應該使用strcpy方法複製new_node -> name中的字值。請參閱this link

strcpy(new_node->name, word);