Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 带有指向字符数组指针的链表_C_Linked List - Fatal编程技术网

C 带有指向字符数组指针的链表

C 带有指向字符数组指针的链表,c,linked-list,C,Linked List,我有一个链表,它的元素是 typedef struct List * News; struct List { char * Text; News NextN; }; 在main函数中,我声明了一个News类型的数组,如下所示 News PTH[50]; for (i = 0; i < 50; i++) { PTH[i] = (News) malloc(sizeof(struct List));

我有一个链表,它的元素是

typedef struct List * News;
struct List
    {
         char * Text;
         News NextN;
    };
在main函数中,我声明了一个News类型的数组,如下所示

News PTH[50];
for (i = 0; i < 50; i++)
    {
         PTH[i] = (News) malloc(sizeof(struct List));
         PTH[i] -> Text = NULL;
         PTH[i] -> NextN = NULL;
    }
其中
msg
是长度为2000的字符数组;然后尝试打印由
PTH[i]->Text打印的文本

p = PTH[i];
if (p -> Text != NULL)
    {
        printf("%s", p -> Text);
        p = p -> NextN;
    }
while (p != NULL)
    {
        printf("%s", p -> Text);
        p = p -> NextN;
    }
}

此算法只添加一个节点。错误在于我如何定义
PTH
,或者我如何将节点放入列表中是否有错误。

可能是您想要的:

if ( PTH[i]->Text == NULL )
{
  PTH[i]->Text = msg;
}
else // first create node, then append by first finding the last node
{
  News it = NULL;
  News t = malloc( sizeof(struct List));
  t->Text = msg;
  t->NextN = NULL;

  for ( it = PTH[i]->NextN; it != NULL; it = it->NextN)
  {
    ;
  }
  it->NextN = t;
}

也许你想要的是这样的东西:

if ( PTH[i]->Text == NULL )
{
  PTH[i]->Text = msg;
}
else // first create node, then append by first finding the last node
{
  News it = NULL;
  News t = malloc( sizeof(struct List));
  t->Text = msg;
  t->NextN = NULL;

  for ( it = PTH[i]->NextN; it != NULL; it = it->NextN)
  {
    ;
  }
  it->NextN = t;
}

也许你想要的是这样的东西:

if ( PTH[i]->Text == NULL )
{
  PTH[i]->Text = msg;
}
else // first create node, then append by first finding the last node
{
  News it = NULL;
  News t = malloc( sizeof(struct List));
  t->Text = msg;
  t->NextN = NULL;

  for ( it = PTH[i]->NextN; it != NULL; it = it->NextN)
  {
    ;
  }
  it->NextN = t;
}

也许你想要的是这样的东西:

if ( PTH[i]->Text == NULL )
{
  PTH[i]->Text = msg;
}
else // first create node, then append by first finding the last node
{
  News it = NULL;
  News t = malloc( sizeof(struct List));
  t->Text = msg;
  t->NextN = NULL;

  for ( it = PTH[i]->NextN; it != NULL; it = it->NextN)
  {
    ;
  }
  it->NextN = t;
}

假设
msg
是用于接收新数据的缓冲区,则必须小心以下语句:

PTH[i] -> Text = msg;
由于
msg
是指向
char
的指针,因此赋值不会复制字符序列;相反,它只会使
PTH[i]>Text
指向与
msg
相同的位置。如果您更改
msg
中的内容,这是有问题的-这些更改当然会反映在为其进行分配的每个
PTH[i]->文本中,即您添加的每个节点。也许,不完全是你想要的。这就是为什么一次只能处理一个节点的原因。它们都得到相同的文本,因为它们都指向相同的内存位置

您应该使用strcpy

strcpy(PTH[i]->Text, msg);
不要忘记包括
string.h

这假设
PTH[i]>Text
已经分配。如果
msg
超过2000个字符,您可能需要使用
strncpy
,以避免缓冲区溢出

如果您没有为
PTH[i]->Text
分配空间,您可以为
PTH[i]->Text
精确地分配
strlen(msg)+1
位置,然后安全地使用
strcpy
。或者您可以使用
strdup
,也在
string.h
中声明,它具有以下行为:

PTH[i]->Text = strdup(msg);

假设
msg
是用于接收新数据的缓冲区,则必须小心以下语句:

PTH[i] -> Text = msg;
由于
msg
是指向
char
的指针,因此赋值不会复制字符序列;相反,它只会使
PTH[i]>Text
指向与
msg
相同的位置。如果您更改
msg
中的内容,这是有问题的-这些更改当然会反映在为其进行分配的每个
PTH[i]->文本中,即您添加的每个节点。也许,不完全是你想要的。这就是为什么一次只能处理一个节点的原因。它们都得到相同的文本,因为它们都指向相同的内存位置

您应该使用strcpy

strcpy(PTH[i]->Text, msg);
不要忘记包括
string.h

这假设
PTH[i]>Text
已经分配。如果
msg
超过2000个字符,您可能需要使用
strncpy
,以避免缓冲区溢出

如果您没有为
PTH[i]->Text
分配空间,您可以为
PTH[i]->Text
精确地分配
strlen(msg)+1
位置,然后安全地使用
strcpy
。或者您可以使用
strdup
,也在
string.h
中声明,它具有以下行为:

PTH[i]->Text = strdup(msg);

假设
msg
是用于接收新数据的缓冲区,则必须小心以下语句:

PTH[i] -> Text = msg;
由于
msg
是指向
char
的指针,因此赋值不会复制字符序列;相反,它只会使
PTH[i]>Text
指向与
msg
相同的位置。如果您更改
msg
中的内容,这是有问题的-这些更改当然会反映在为其进行分配的每个
PTH[i]->文本中,即您添加的每个节点。也许,不完全是你想要的。这就是为什么一次只能处理一个节点的原因。它们都得到相同的文本,因为它们都指向相同的内存位置

您应该使用strcpy

strcpy(PTH[i]->Text, msg);
不要忘记包括
string.h

这假设
PTH[i]>Text
已经分配。如果
msg
超过2000个字符,您可能需要使用
strncpy
,以避免缓冲区溢出

如果您没有为
PTH[i]->Text
分配空间,您可以为
PTH[i]->Text
精确地分配
strlen(msg)+1
位置,然后安全地使用
strcpy
。或者您可以使用
strdup
,也在
string.h
中声明,它具有以下行为:

PTH[i]->Text = strdup(msg);

假设
msg
是用于接收新数据的缓冲区,则必须小心以下语句:

PTH[i] -> Text = msg;
由于
msg
是指向
char
的指针,因此赋值不会复制字符序列;相反,它只会使
PTH[i]>Text
指向与
msg
相同的位置。如果您更改
msg
中的内容,这是有问题的-这些更改当然会反映在为其进行分配的每个
PTH[i]->文本中,即您添加的每个节点。也许,不完全是你想要的。这就是为什么一次只能处理一个节点的原因。它们都得到相同的文本,因为它们都指向相同的内存位置

您应该使用strcpy

strcpy(PTH[i]->Text, msg);
不要忘记包括
string.h

这假设
PTH[i]>Text
已经分配。如果
msg
超过2000个字符,您可能需要使用
strncpy
,以避免缓冲区溢出

如果您没有为
PTH[i]->Text分配空间,您可以为
PTH[i]->Tex精确地分配
strlen(msg)+1
位置