2

我试图了解链接列表是如何工作的;在更改导师的示例代码时,我得到“左操作数必须是左值”错误......这是我的代码。任何帮助表示赞赏:)

struct node
{
    char name[20];
    struct node *next;
};

/*Function to allocate memory and initialize node - returns pointer to node*/
struct node*mknode(char *str)
{
    struct node *np;

    np = (struct node*)malloc(sizeof(struct node));

    if(np)
    {
        np->name = *str;
        np->next = NULL; /*sets the 'next' pointer to last list item to NULL*/
    }

    return np;

}

int main(void)
{

int i,menu,k=1,number;
char name[20];
char *str = name;
struct node* n;
struct node *head=NULL;


printf("Link Lists\n    1-Enter Data into lists\n   2-Display All List Items\n  3-Quit Program :(\n");

    do 
    {
        printf("\nPlease choose an option:  ");
        scanf("%d",&menu);

        switch (menu)
        {
            case 1:
                printf("\nPlease Enter A Number:");
                scanf("%d",&name);

                n=mknode(str); /*create new node with i as data*/

                append_node(&head,n); /*add new node to end of list*/
            break;

这是我得到错误的地方

np->name = *str;

将结构数据类型从整数更改为字符后

谢谢

4

2 回答 2

3

在 C 中,数组不是可修改的左值,即不能分配给数组。如果我正确理解您要执行的操作,您可以尝试:

strcpy(np->name, str);

如果str不是受信任的字符串(如果您之前没有验证它),您可以使用memcpy而不是strcpy.

于 2013-03-07T21:24:15.030 回答
1

此语句有两个错误

np->name = *str;

firstname被声明为一个数组,你不能通过赋值来改变数组的位置。相反,您必须将字符串的内容复制到name使用strcpy

strcpy_s( np->name, sizeof(name), str );

第二个错误是您str在分配中取消引用字符串,当您取消引用字符串时,*str您只是在复制字符串的第一个字符,就像在写str[0]

您也可以将 name 声明为 char 指针,但随后需要分配并稍后释放字符串:

typedef struct node {
  char* name;
  struct node* next;
} node;
...

np->name = strdup(str); /* allocates enough space for string and copies it. */
于 2013-03-07T21:33:31.490 回答