这是什么意思:'=':左操作数必须是l值?

时间:2016-01-10 15:23:15

标签: c struct

我正在使用结构编写代码,该结构将读取包含有关book的数据的文本文件。姓名,作者,出版商,类型......

我的头文件如下:

typedef struct book{    

    char name[NAME_LENGTH];
    char authors[AUTHORS_NAME_LENGTH];
    char publisher[PUBLISHER_NAME_LENGTH];
    char genre[GENRE_LENGTH];
    int year;
    int num_pages;
    int copies;
}book;


typedef struct library
{    

    book books[BOOK_NUM];

}library;

typedef char* string;

代码是:

    if (NULL == (incoming_books = fopen(".\books.txt", "r")))
    {            /* opening file for reading */
        /*printf("Error opening file"); write to file*/
        exit(1);
    }
    while (!feof(incoming_books))
    {
        fgets(line,200,incoming_books);//copies one line, assuming no longer than 200 chars

        idx_helper = strchr(line, '$');//finds '$' index, attribures are seperated by "$$$"
        index = (int)(idx_helper - line);// cast index into int
        char_num = index;
        if (NULL != memcpy(temp_string, line, char_num))//copies string (name)
            temp_book->name = *temp_string;

        index += 3;                         // incrementing index by 3
        idx_helper = strchr(&line[index], '$');   // same for authors
        index = (int)(idx_helper - &line[index]);
        char_num = index;
        if (NULL != memcpy(temp_string, &line[index], char_num*sizeof(char)))
        temp_book->authors = *temp_string;
    }

等每个图书属性

我收到两个错误: 1.错误7错误C2106:'=':左操作数必须是l值    它指向行temp_book-> name = * temp_string;和temp_book-> authors = * temp_string; 2. IntelliSense:表达式必须是可修改的左值     它指向相同的行。

可能是指针问题吗?

1 个答案:

答案 0 :(得分:1)

因为数组是不可修改的 lvalue

摘自C11 Standard Draft N1570 - (粗体细分在此答案中突出显示,以帮助读者找到有趣的部分)。

  

6.3.2.1左值,数组和函数指示符

     
      
  1. 左值是一个表达式(具有void以外的对象类型),可能指定一个对象; 64)如果左值在评估时未指定对象,则行为未定义。当一个对象被称为具有特定类型时,该类型由用于指定对象的左值指定。 可修改的左值左值,它没有数组类型,没有不完整的类型,没有const限定类型,如果它是一个结构或联合,则没有任何成员(包括,递归地,所有包含的聚合或联合的任何成员或元素)具有const限定类型。
  2.               

    64) 名称“左值”最初来自赋值表达式E1 = E2,其中左操作数E1必须是(可修改的)左值。它可能更好地被视为代表一个   对象''定位器值''。有时被称为''rvalue'的东西在本国际标准中被描述为''表达的价值''。

您使用memcpy()复制到temp_string,您应该使用它直接复制到数组。另外,不要使用sizeof(char),因为它永远不会是 1 ,并始终为nul终结符分配空间,并复制nul终止符。否则,当您将数组传递给期望字符串的函数(如各种str *函数或printf()"%s"说明符未定义的行为< / em>将会发生。

另外,在你的代码中有这个

while (!feof(incoming_books))

fgets()失败时,这只会是 true ,然后会在第一次fgets()失败后发生,因为您永远不会检查最后一行是否会重复,你应该这样做

while (fgets(line, 200, incoming_books) != NULL)