2013-04-22 116 views
-1

所以我有一個名爲task的結構體,它初始化了一些東西。在結構中操作字符串C

typedef struct _task{ 
     char *task_name; 
     int priority; // higher numbers have higher priority                             
     char date_entered[11]; 
     char date_completed[11]; // not used yet                                
} task; 

我試圖寫一個函數命名的任務* makeTask是發生在(字符*名稱,字符*日期和char *優先級) 我需要爲新的任務分配內存,內部名稱新的任務,我想日期。到目前爲止,我已經到了使用這種分段錯誤:

task *makeTask(char *name, char *date, char *priority) 
{ 
    int i; 
    int j; 
    int k; 
    task *newtask = malloc(sizeof(task)); 
    for(i=0; name[i] != '\0'; i++){ 
    if(name[i] == '\n') 
     name[i] = '\0'; 
    } 
    newtask->task_name = malloc(sizeof(char *)*(strlen(name)+1)); 
    strcpy(newtask->task_name, name); 
    newtask->priority = atoi(priority); 
    for(j=0; date[j] != '\0'; j++){ 
    if(date[j] == '\n') 
     date[j] == '\0'; 
    } 


    return newtask;// FILE THIS IN                                    
} 

我覺得我沒有琴絃的真正堅實的理解,以及如何操縱它們。爲什麼我的代碼在這裏給我一個分段錯誤?它是循環還是我爲結構分配內存的方式?任何幫助,將不勝感激。

+0

您需要提出具體問題。 – djechlin 2013-04-22 16:53:57

+0

哪條線出現分段故障? – 2013-04-22 16:54:58

+0

我認爲分段錯誤發生在我分配內存或循環的地方。我不確定。 – Vince 2013-04-22 17:42:22

回答

0

我還沒有發現任何可以保證分段錯誤的東西,但這裏有一些問題。

您的循環,

for(i=0; name[i] != '\0'; i++){ 
    if(name[i] == '\n') 
     name[i] = '\0'; 
    } 
被有些怪異,你假定該 name已經正確初始化

一邊。如果沒有,那麼該循環會引發分段錯誤。這同樣適用您date循環

以下行: newtask-> TASK_NAME = malloc的(的sizeof(炭(strlen的(名稱)+1));

sizeof(char *),有點奇怪,因爲你正在初始化一個字符數組,而不是一個字符指針數組(數組數組)。我不知道這是否真的造成太大的差別,但這很奇怪。

+0

Hm之後發生了段錯誤**。那麼我認爲名字已經通過參數包含在函數中了。你是說,只要參數通過函數傳遞,我仍然需要初始化說a * x等於*名稱,例如,將這些參數放入混合中? – Vince 2013-04-22 17:22:43

+0

@Vince我的意思是,有人可以調用你的函數,並將他們想要的任何老'char *'傳入那裏,並且他們不會被迫確保它包含'\ 0'。 – 2013-04-22 17:44:14

+0

@Vince哦,'char *'只是內存中的一個地址,所以你對你的函數中引用'name'的內存所作的所有更改,也會改變你的函數之外由'name'引用的內存因爲它是相同的記憶 – 2013-04-22 17:48:04