我目前在borland C编码,我遇到了结构解除引用的问题。 current-> value = x;给出左值所需的错误。这不会发生在" value"是char。无论如何都要将x的值赋给current-> value?
#include<stdio.h>
#include<conio.h>
char x[16];
FILE *fin;
struct node {
char value[16];
struct node *next,*prev;
};
struct node *current;
void main(){
fin = fopen("tokens.ctr","r");
current = (struct node*) malloc(sizeof(struct node));
fscanf(fin,"%s",&x);
current->value = x;
}
答案 0 :(得分:3)
简而言之,因为c不允许你复制那样的数组。你必须复制数组的每个元素,或者使用循环或使用memcpy
ot strcpy
顺便说一句,
int
,而不是void
malloc
投出回报。它返回void *
,可以将其分配给任何其他指针类型。fscanf
来电可能会导致未定义的行为
答案 1 :(得分:2)
你的主要是错的:
void main(){
fin = fopen("tokens.ctr","r");
current = (struct node*) malloc(sizeof(struct node));
fscanf(fin,"%s",¤t->value);
// current->value = x; <-- this was wrong too, read the comments:)
}
你应该记住,你最多可以阅读15个字符(+ \ 0)。 %s会尽可能多地阅读。您应该使用%15s
或其他功能,例如fread
,fgets
。
编辑:使用fgets
和strncpy
,关闭流和内存:
void main(){
FILE* fin = fopen("tokens.ctr","r");
if (NULL != fin) {
struct node* current = (struct node*) malloc(sizeof(struct node));
if (NULL != current) {
char x[16];
fgets(x, sizeof(x), fin); // fread(fin,
strncpy(current->value, x, sizeof(current->value));
free(current);
}
fclose(fin);
}
}
--std=c99
一起使用)fgets
从 fin 中读取的内容最多小于 sizeof(x)个字符。您不必维持%15s
与x
的大小之间的关系。strncpy
最多从sizeof(current->value)
x
复制current->value
。答案 2 :(得分:0)
fscanf(fin,"%s",&x);
current->value = x;
应该是:
fscanf(fin, "%s", x);
strcpy(current->value, x);
或:
fscanf(fin, "%s", current->value);