对于家庭作业,我们正在开发CSV解析器。我正在尝试让事情奏效,但我遇到了一个问题。我似乎无法为结构中的“字段”值赋值。在他们提供的代码中,他们有:
typedef char f_string[MAX_CHARS+1] ; /* string for each field */
typedef struct {
int nfields; /* 0 => end of file */
f_string field[MAX_FIELDS]; /* array of strings for fields */
} csv_line ;
使用在20和15定义的上述常量。看看它们有什么,struct hold和int,它包含一个数组,应该使用前面定义的f_string typedef填充它。好吧,很酷。我试着这样做:
f_string test = "Hello, Bob";
f_string testAgain = "this is dumb, k?";
f_string anArray[MAX_FIELDS] = {*test, *testAgain};
csv_line aLine;
aLine.nfields = 3;
aLine.field = *anArray;
当我制作“anArray”时,如果我没有测试和testAgain的解引用,我会收到关于在没有演员表的情况下对指针进行整数的警告。所以我把它们留在了。但是这句话:
aLine.field = *anArray;
返回错误:“csv.c:87:错误:赋值中的不兼容类型”有或没有指针...所以我不确定我应该如何分配该变量?帮助将不胜感激!
答案 0 :(得分:5)
您无法使用=
指定数组。有关更详细的说明,请参阅this question。
您需要使用strcpy
(或更安全的strncpy
)函数复制每个字符串:
for (int i = 0; i < aLine.nfields; ++i)
{
strncpy(aLine.field[i], anArray[i], MAX_CHARS);
}
此外,您提供的测试代码不会按预期执行。
f_string test = "Hello, Bob";
f_string testAgain = "this is dumb, k?";
f_string anArray[MAX_FIELDS] = {*test, *testAgain};
这将复制test
和testAgain
的第一个字符。您需要执行以下操作:
f_string test = "Hello, Bob";
f_string testAgain = "this is dumb, k?";
f_string anArray[MAX_FIELDS];
strcpy(anArray[0], test);
strcpy(anArray[1], testAgain);
或者只是:
f_string anArray[MAX_FIELDS] = {"Hello, Bob", "this is dumb, k"};