我正在尝试编写一个函数words
,它生成一个单独链接的单词列表(由空格分隔的字符序列)作为参数传递的文本。结果列表中的单词应与文本中的单词相同。
不幸的是程序在运行时会出错,你能解释一下我出了什么问题吗?我也很感激一些提示。这是代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
struct node{
char* word;
struct node* next;
};
void printList(struct node* list){
struct node* it = list;
while(it != NULL){
printf("%s ", it -> word);
it = it -> next;
}
printf("\n");
}
void insertLast(struct node* tail, char* neww){
tail -> next = (struct node*)malloc(sizeof(struct node));
tail = tail -> next;
tail -> word = neww;
tail -> next = NULL;
}
struct node* words(char* s){
char* slowo = strtok(s, " ");
struct node* head;
struct node* tail;
if (sizeof(slowo) == 0)
return NULL ;
head = (struct node*)malloc(sizeof(struct node));
head -> word = slowo;
head -> next = NULL;
tail = head;
slowo = strtok(NULL, " ");
while (slowo != NULL){
insertLast(tail, slowo);
tail = tail -> next;
slowo = strtok(NULL, " ");
}
return head;
}
int main() {
printList(words("Some sentance la al olaalal"));
getch();
return (EXIT_SUCCESS);
}
答案 0 :(得分:1)
如果您不想insertLast
在调用函数中设置tail
,则必须通过引用传递指针(即作为指针的指针)。
void insertLast(struct node** tail, char* neww)
在insertLast
中使用适当的解除引用功能。
答案 1 :(得分:0)
您的words()
函数就地修改了其参数(s
)。您使用字符串文字调用words()
,并且不允许修改字符串文字。要解决此问题,您可以使用s
或strdup()
将malloc()+strcpy()
放入堆分配的内存中。