我正在做这个家庭作业,它要求我接受一个大字符串,并将其分解为许多子串,其中每个字符串由字符串内的'\ n'新行值指示,并将其存储到链表,例如:
string = "hello world\n i need help!!"
会变成:
string1 = "hello world\n"
string2 = "i need help!!"
我已经编写了这段代码,它将字符串分解为子字符串并将它们存储到单个节点中。代码本身,非常难看,需要更多细化,但我甚至无法达到这一点,因为某些奇怪的地方似乎发生在中间,链接列表中的所有字符串都被我添加到的最后一个字符串替换链表......
这是我的代码,如果可以,请提供帮助:
#define eq(A, B) ( A == B )
typedef struct list * link;
typedef char Item;
struct list {
link next;
Item *string;
};
void printlist (link ls);
link newLS (char text[]);
link newNode (char text[]);
void insertNode (link next, Item item[]);
link newLS (char text[]) {
int i = 0;
int j = 0;
char temp[(strlen(text))];
link new = NULL;
while (text[i] != '\0') {
temp[j] = text[i];
if (text[i] == '\n' || text[i+1] == '\0') {
temp[j+1] = '\0';
j = -1;
if (new == NULL) {
new = newNode(temp);
printf("new: %s", new->string);
} else {
insertNode(new, temp);
printf("new: %s", new->next->string);
}
}
i++;
j++;
}
printlist(new);
return new;
}
link newNode (char text[]) {
link new = malloc(sizeof(*new));
assert(new != NULL);
new->string = malloc ((strlen(text)) * sizeof(char));
new->string = text;
new->next = NULL;
return new;
}
void insertNode (link ls, Item item[]) {
assert (ls != NULL);
assert (item != NULL);
while (ls->next != NULL) {
ls = ls->next;
}
ls->next = newNode(item);
}
int main(int argc, char **argv) {
link ls;
ls = newLS("1\n2\n3");
return 0;
}
我们必须使用这个功能:
link newLS (char text[])
答案 0 :(得分:1)
#define eq(A, B) ( A == B )
不是一个好主意,改进是将其定义为#define eq(A, B) ( (A) == (B) )
你分配缓冲区,然后不使用它,而是指定另一个指向指针的指针:
new->string = malloc ((strlen(text)) * sizeof(char));
new->string = text;
相反,您应该复制给定指针的数据:
new->string = malloc ((strlen(text) + 1) * sizeof(char));
memcpy(new->string, text, strlen(text) + 1);
此外,当您尝试free
分配的内存时,您会遇到分段错误,因为new->string
未指向已分配的区域...
答案 1 :(得分:0)
大声笑你用的是什么编译器!你命名变量'new'
无论如何,
您正在重写已传递给Node初始值设定项的char *。 首先,你创建了一个temp =“1”的newNode(temp),然后在下一次迭代中用值“2”覆盖temp。
解决方法:
new = newNode(temp);
在上面的行后插入 - > temp = new char [strlen(text)];
insertNode(new,temp);
在上面的行后插入 - > temp = new char [strlen(text)];