2013-03-07 2 views
2

пытаюсь понять, как работают списки ссылок; и при изменении кода примера от преподавателя я получаю ошибку «левый операнд должен быть l-value» ... вот мой код. Любая помощь приветствуется :)левый операнд должен быть l-значением, программирование C

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; 

после изменения типа данных структур из целого числа обугливается

благодаря

+0

Вы обрабатываете 'np-> name' как указатель, когда это массив. Вы не можете присвоить что-то массиву. – teppic

+0

Вы не можете назначить непосредственно массиву символов, вам нужно использовать 'strcpy' или' strncpy' –

+0

возможный дубликат [ошибка C2106: '=': левый операнд должен быть l-значением в C] (http: // stackoverflow.com/questions/8036324/error-c2106-left-operand-must-be-l-value-in-c) –

ответ

3

В массивах C Арен» t изменяемых значений l, то есть вы не можете назначить массиву. Если я правильно понял, что вы пытаетесь сделать, вы можете попробовать:

strcpy(np->name, str); 

str Если не является доверенным строка (если вы не подтвердите его раньше), вы можете использовать memcpy вместо strcpy.

+1

'strncpy', пожалуйста – Kevin

+0

@Kevin, Ates ** strncpy не более безопасная версия' strcpy' **. – cnicutar

+0

И почему вы говорите это? – Kevin

1

есть две ошибки в этом заявлении

np->name = *str; 

первый name объявлен как массив, вы не можете изменить, где массив путем присвоения ему. вместо этого вы должны скопировать содержимое строки в name используя strcpy

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

второй ошибки в том, что вы derefencing строки str в вашем назначении, когда вы derefence строки *str вы просто скопировать первый символ строки , это похоже на написание str[0]

в качестве альтернативы вы можете объявить имя как указатель полукокса, но вместо этого вы затем нужно выделить, а затем освободить строку:

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

np->name = strdup(str); /* allocates enough space for string and copies it. */ 
+0

Спасибо за быстрый ответ. Я новичок, так что медведь со мной здесь. В чем разница между strcpy_s (np-> name, sizeof (name), str); и strcpy (np-> name, str); –

+0

, тогда было бы легче избавиться от * str и использовать имя [20], а не как в основной программе? - Я не хочу иметь дело с распределением памяти в данный момент :) –

+0

@DexDave 'strcpy_s' является квазистандартным. Это часть дополнительных интерфейсов проверки приложений K * Bounds *, введенных в C11. Например, он не поддерживается 'glibc'. – cnicutar