C:输出包含问号?

时间:2014-12-04 03:51:31

标签: c arrays input output strtok

编辑,想通了。新代码如下:

  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-2921

83 Watson Vera(640)276-5047

84怀特黑德韦恩(681)747-8152

85 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-2921

83 Watson Vera(640)276-5047

84怀特黑德韦恩(681)747-8152

85 Winters Damian(790)348-2599

86 York Keith(592)276-6850

87 Zamora Dean(281)906-9590

88?J?我?琼斯818

89 Jim Jones 616

90 Foo Bar 123

如您所见,在第88行,输出以?J?I开始?...以下所有输入均正常。 我读到它与不可读的值有关,但我对于发生的事情却很丢失!我对C很新,任何帮助都表示赞赏!

3 个答案:

答案 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++;
}