编辑,想通了。新代码如下:
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 Velez Ingrid(648)685-8104
82 Warren Buffy(570)247-292183 Watson Vera(640)276-5047
84怀特黑德韦恩(681)747-815285 Winters Damian(790)348-2599
86 York Keith(592)276-6850
87 Zamora Dean(281)906-9590
让我说我用我的输入调用该函数3次:
Bob Jones 818
Jim J 616
Foo Bar 123
当我再次打印数组时,我得到:
81 Velez Ingrid(648)685-8104
82 Warren Buffy(570)247-292183 Watson Vera(640)276-5047
84怀特黑德韦恩(681)747-815285 Winters Damian(790)348-2599
86 York Keith(592)276-6850
87 Zamora Dean(281)906-9590
88?J?我?琼斯81889 Jim Jones 616
90 Foo Bar 123
如您所见,在第88行,输出以?J?I开始?...以下所有输入均正常。 我读到它与不可读的值有关,但我对于发生的事情却很丢失!我对C很新,任何帮助都表示赞赏!
答案 0 :(得分:2)
card *newcard = malloc(sizeof(newcard));
仅分配4个字节 - 指针的大小
它应该是:
card *newcard = malloc(sizeof(*newcard));
答案 1 :(得分:0)
名称被覆盖,因为为newcard分配的缓冲区太小。请参阅下面的答案。
无关,如果您只是读取newuser缓冲区中的单词,则没有必要使用换行符来终止字符串
另外,在释放字符串结构时,每个字符串也应该被释放,以免泄漏内存
编辑:我原来的观点错了,这些都是次要的。
答案 2 :(得分: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++;
}