我是数据结构和链表的新手。 我正在使用C中的树进行名为 Amazon产品可用性检查器”的项目。所以我想在树的每个节点中存储字符串,但是在存储字符串时,代码没有显示任何错误,但是输出也没有得到打印。我已经通过节点打印功能来打印字符串,但是没有打印任何内容。
我只共享了一个字符串和一个节点的代码。我正在研究ubuntu,并且正在使用C语言进行编码。
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct node {
char clothing[10];
struct node *next;
} node;
// 1) creating node
node *create(char const ch[]) {
int i;
node *head = NULL;
node *temp = NULL;
node *p = NULL;
temp = (struct node *)malloc(sizeof(struct node));
temp->clothing[10] = ch[10];
temp->next = NULL;
return temp;
}
// 2) print
void print(node *head) {
node *p = head;
while (p != NULL) {
printf("%s", p->clothing);
p = p->next;
}
}
int main() {
node *head = create("clothing");
print(head);
}
答案 0 :(得分:1)
您的create
函数不正确:
malloc
失败clothing[10]
来引起未定义的行为。顺便说一句,您阅读了ch[10]
,这可能也超出了范围。如果ch
太长,则应复制字符串,同时避免缓冲区溢出。这是改进版:
#incude <string.h>
#incude <stdlib.h>
node *create(char const ch[]) {
temp = malloc(sizeof(node));
if (temp != NULL) {
temp->next = NULL;
temp->clothing[0] = '\0';
strncat(temp->clothing, ch, sizeof(temp->clothing) - 1);
}
return temp;
}
自C99以来,就存在一种分配字符串副本的方式,而没有对其大小的限制,并且不需要在node
结构中进行单独的分配和分配指针。它称为灵活数组。运作方式如下:
typedef struct node {
struct node *next;
char clothing[];
} node;
node *create(char const ch[]) {
size_t size = strlen(ch) + 1;
temp = malloc(sizeof(node) + size);
if (temp != NULL) {
temp->next = NULL;
memcpy(temp->clothing, ch, size);
}
return temp;
}
答案 1 :(得分:0)
我已经通过节点打印功能来打印字符串,但是什么也没打印。
做
temp -> clothing[10] = ch[10];
您在字符串中写入了(并且可能被读取)了一个字符,temp -> clothing
中的最大索引为9
您想要类似的东西
strcpy(temp -> clothing, ch);
但是要注意不要走在 clothing 之外,因为 ch 太长
可以这样
strncpy(temp -> clothing, ch, sizeof(temp -> clothing) - 1);
temp -> clothing[sizeof(temp -> clothing) - 1] = 0; /* useful if strlen(ch) >= 10 */
您确定不希望将char clothing[10];
替换为char * clothing;
来将限制限制为10吗?
答案 2 :(得分:0)
node *addnode(node *after, const char *str)
{
node *nptr;
nptr = malloc(sizeof(*nptr));
nptr -> partstr = malloc(strlen(str) + 1);
/* error checking you need to add after every malloc */
strcpy(nptr -> partstr, str);
if(!after)
{
nptr -> prev = NULL;
nptr -> next = NULL;
}
else
{
after -> next -> prev = nptr;
nptr -> next = after -> next;
after -> next = nptr;
nptr -> prev = after;
}
return nptr;
}