如何将字符数组(字符串)传入链表(队列)及参数传递疑问
解答你的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
相关产品推荐
相关产品推荐

