2014-12-04 70 views
0

編輯,想通了。新代碼如下:C:輸出包含問號?

void add_card_to_rolodex(card *card_array) 
{  
     card newcard = {"", "", ""}; 
     char newuser[250]; 
     scanf(" %[^\n]%*c", newuser); 
     strcat(newuser, "\n"); 
     newcard.last_name = strdup(strtok(newuser, " ")); 
     newcard.first_name = strdup(strtok(NULL, " ")); 
     newcard.phone_number = strdup(strtok(NULL, " ")); 

     card_array[size] = newcard; 
     size++; 

} 

舊代碼:

void add_card_to_rolodex(card *card_array) 
{ 
     //Function asks for input and adds it to the passed array 
     //card is a struct of char * 
     card *newcard = malloc(sizeof(newcard)); 
     char newuser[250]; 
     scanf(" %[^\n]%*c", newuser); 
     strcat(newuser, "\n"); 

     newcard->last_name = strdup(strtok(newuser, " ")); 
     newcard->first_name = strdup(strtok(NULL, " ")); 
     newcard->phone_number = strdup(strtok(NULL, " ")); 

     //size is global 
     card_array[size] = *newcard; 
     size++; 
     free(newcard); 

} 

我試圖添加到文件的末尾,以前被讀取到一個數組。 這是在調用此函數之前的原始輸出。

...

81薩斯英格麗(648)685-8104

82沃倫捉鬼(570)247-2921

83沃森維拉(640)276-5047

84白石韋恩(681)747-8152

85個溫特斯達米安(790)348-2599

86紐約基思(592)276-6850

87薩莫拉院長(281)906-9590

可以說,我調用該函數3次,我作爲輸入:

鮑勃·瓊斯818

,吉姆616

美孚酒吧123

當我再次打印陣列我得到:

81貝萊斯英格麗(648)685-8104

82沃倫·巴菲(570)247-2921

83沃森維拉(640)276-5047

84白石韋恩(681)747-8152

85溫特斯達米安(790)348-2599

86紐約基思(592)276-6850

87 Zamora的迪安(281)906-9590

88?J·我?瓊斯818

89吉姆·瓊斯616

90美孚杆123

正如你所看到的,上線88,輸出用?J·我?......所有的以下輸入啓動精細。 我讀到它與不可讀取的值有關,但我相當失落,否則會發生什麼!我對C相當陌生,任何幫助表示讚賞!

回答

0

名稱被覆蓋,因爲分配給newcard的緩衝區太小。請參閱下面的答案。

無關,如果你只是讀出來的話的NEWUSER緩衝的,沒有一點爲換行符終止字符串

還,釋放字符串的一個結構時,每個字符串應該被釋放,以及以不泄漏內存

編輯:我原來的觀點是錯誤的,這些都是次要的。

+0

這是不正確的。 'card_type'被聲明爲'card * card_array'。 – 2014-12-04 04:10:15

+0

哎呀,你就是。我把它編輯出來(我最初把卡片*弄糊塗了)。謝謝 – Andras 2014-12-04 04:14:42

2
card *newcard = malloc(sizeof(newcard)); 

只分配4個字節 - 指針

的大小應該是:

card *newcard = malloc(sizeof(*newcard)); 
0

不知道爲什麼你需要使用堆內存newcard。您可以使用:

void add_card_to_rolodex(card *card_array) 
{ 
    //Function asks for input and adds it to the passed array 
    //card is a struct of char * 
    card newcard; 
    char newuser[250]; 
    scanf(" %[^\n]%*c", newuser); 
    strcat(newuser, "\n"); 

    newcard.last_name = strdup(strtok(newuser, " ")); 
    newcard.first_name = strdup(strtok(NULL, " ")); 
    newcard.phone_number = strdup(strtok(NULL, " ")); 

    //size is global 
    card_array[size] = newcard; 
    size++; 
} 
+0

謝謝,只是想通了!完善。 – user3566141 2014-12-04 04:19:25

+0

@ user3566141,我發佈了這個答案後看到了你的修改。 – 2014-12-04 04:19:59