我正在使用结构编写代码,该结构将读取包含有关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:表达式必须是可修改的左值 它指向相同的行。
可能是指针问题吗?
答案 0 :(得分:1)
因为数组是不可修改的 lvalue 。
摘自C11 Standard Draft N1570 - (粗体细分在此答案中突出显示,以帮助读者找到有趣的部分)。
6.3.2.1左值,数组和函数指示符
- 左值是一个表达式(具有
醇>void
以外的对象类型),可能指定一个对象; 64)如果左值在评估时未指定对象,则行为未定义。当一个对象被称为具有特定类型时,该类型由用于指定对象的左值指定。 可修改的左值是左值,它没有数组类型,没有不完整的类型,没有const限定类型,如果它是一个结构或联合,则没有任何成员(包括,递归地,所有包含的聚合或联合的任何成员或元素)具有const限定类型。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)