You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将字符数组(字符串)传入链表(队列)及参数传递疑问

解答你的C链表与字符串处理问题

先针对你的几个核心疑问逐一拆解,再结合代码给出具体修正方案:

1. 传递数据:用指针还是单词数组?

你的data_t是固定大小的字符数组(typedef char data_t[MAXLETTERS];),每个链表节点必须存储独立的字符串副本,而非指向外部内存的指针。原因很直白:如果只传递指针,当外部的word临时数组(比如栈上的变量)被覆盖或销毁时,链表节点里的指针就会变成野指针,导致访问无效数据。

所以正确逻辑是:把传入的字符串复制到节点内部的data_t数组中,而不是直接赋值指针。

2. strcpy应该放在哪里?

必须放在insert_at_foot函数里。你代码里的new->data = word;是典型错误——C语言中数组不能直接赋值,这正是需要用strcpy的场景:创建新节点后,把传入的word字符串复制到节点的word数组里,保证每个节点拥有独立的字符串内存。

修正后的关键代码片段:

// 替换错误的new->data = word;
strcpy(new->word, word); // 注意你的节点结构体里是word成员,不是data

3. 读取百分号后的最后一行

你的输入分两部分:前面是#开头的字典行,后面是%%%%%%%%%%分隔后的目标句子。要读取后面的内容,需要先跳过前面的所有字符,直到匹配到%%%%%%%%%%,再开始读取单词:

修改main里的读取逻辑:

char temp[MAXLETTERS];
list_t *list = make_empty_list(); // 假设你有创建空链表的函数
// 先跳过前面的#开头内容,直到遇到分隔符
while (scanf("%s", temp) != EOF) {
    if (strcmp(temp, "%%%%%%%%%%") == 0) {
        break; // 找到分隔符,退出前置循环
    }
}
// 读取目标句子的单词并插入链表
char word[MAXLETTERS];
while (scanf("%s", word) != EOF) {
    insert_at_foot(list, word);
}

完整代码修正要点

除了上面的核心问题,还有几个细节需要调整:

  • 你的节点结构体成员是word,不是data,strcpy要对应new->word
  • scanf("%s", getword(word, limit))写法错误,scanf的第二个参数直接传word即可(前提是MAXLETTERS足够容纳最长单词+结束符\0)
  • 确保空链表初始化正确,比如make_empty_list要返回head和foot都为NULL的list_t

修正后的insert_at_foot完整函数:

list_t *insert_at_foot(list_t *list, data_t word) {
    node_t *new = (node_t*)malloc(sizeof(*new));
    assert(list != NULL && new != NULL);
    
    // 复制字符串到节点的word数组
    strcpy(new->word, word);
    new->next = NULL;

    if (list->foot == NULL) {
        list->head = list->foot = new;
    } else {
        list->foot->next = new;
        list->foot = new;
    }
    return list;
}

测试验证

用你提供的输入测试时,程序会先跳过所有#开头的内容,遇到%%%%%%%%%%后,将后面的hugh、jackman、is等单词依次插入链表尾部,最后遍历链表就能输出这些独立单词。

内容的提问来源于stack exchange,提问作者mcoder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:23:58