2014-12-04 62 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