2016-10-04 63 views
0

我想將字符串從一個結構中的字段複製到另一個結構(一個結點),這樣我就可以最終創建一個哈希表。但是,我似乎在實際的字符串複製中遇到了一些問題。我已經創建了一個for循環來遍歷源stuct中的字符串,並且我知道迭代工作正常,因爲如果我printf源字符串(data [i] .c_name),它們會打印出來。不幸的是,當我嘗試打印目標(class_id)時,它似乎是空的(因此我的哈希函數當然沒有太多)。任何洞察潛在的問題在這裏將不勝感激。如果我沒有給出足夠的上下文,請讓我知道。C - 將字符串從一個結構複製到節點的問題

#define LENGTH 30 
#define MAX_OBS 80000 

typedef struct 
{ 
    char c_name[LENGTH]; 
    char s_name[LENGTH]; 
    double value[MAX_OBS]; 
} 
sample; 

typedef struct node 
{ 
    char class_id[LENGTH]; 
    struct node *next; 
} 
node; 

{ 
    char class_id[LENGTH]; 

    for (int i = 0; i < total_columns; i++) 
    { 
     // malloc a new node pointer for each new class label 
     node *new_node = malloc(sizeof(node)); 

     // check that there was sufficient memory 
     if (new_node == NULL) 
     { 
      return 6; 
     } 

     // copy c_name into node -- failing - class_id is empty 
     strcpy(new_node->class_id, data[i].c_name); 
     printf("%s\n", class_id); 
    } 
} 

回答

1

刪除您打印,因爲它從來沒有初始化的最後char class_id[LENGTH];。然後切換你的printf()來使用strcpy的實際目標。

 strncpy(new_node->class_id, data[i].c_name, LENGTH); 
printf("%.*s\n", LENGTH, new_node->class_id);

我還放了幾個長度限制在我的代碼,以確保你不要做壞輸入壞事沒有終端\ 0。除非以故障安全方式生成,否則千萬不要盲目信任C輸入。

免責聲明:桌面檢查更改。實際的調試作爲練習留給學生。

+0

啊太棒了!謝謝吉爾伯特!雖然我在概念上有點困惑 - new_node只是指向class_id,那麼爲什麼不打印class_id工作?另外 - 我絕對可以理解確保只允許LENGTH被複制的重要性,但是由於這兩個字段都是由相同的長度定義的,爲什麼離開它不安全呢?再次感謝你的幫助! –

+0

@AllieH名爲new_node的局部變量未指向名爲class_id的局部變量。名爲new_node的局部變量指向一個節點,該節點具有一個名爲class_id的成員,該成員與名爲class_id的局部變量無關。 – immibis

相關問題