将数组分配给C中的Struct值

Eth*_*ick 0 c arrays struct pointers

对于家庭作业,我们正在开发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 ;
Run Code Online (Sandbox Code Playgroud)

使用上面定义的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;
Run Code Online (Sandbox Code Playgroud)

当我制作"anArray"时,如果我没有测试和testAgain的解释,我会收到关于在没有演员表的情况下对指针进行整数的警告.所以我把它们留在了.但是这条线:

aLine.field = *anArray;
Run Code Online (Sandbox Code Playgroud)

返回错误:"csv.c:87:错误:赋值中的不兼容类型"有或没有指针那么...所以我不确定我应该如何分配该变量?帮助将不胜感激!

Cha*_*via 5

您无法使用分配给数组=.有关更详细的说明,请参阅此问题.

您需要使用strcpy(或更安全strncpy)函数复制每个字符串:

for (int i = 0; i < aLine.nfields; ++i)
{
  strncpy(aLine.field[i], anArray[i], MAX_CHARS);
}
Run Code Online (Sandbox Code Playgroud)

此外,您提供的测试代码不会按预期执行.

f_string test = "Hello, Bob";
f_string testAgain = "this is dumb, k?";
f_string anArray[MAX_FIELDS] = {*test, *testAgain};
Run Code Online (Sandbox Code Playgroud)

这将复制的第一个字符testtestAgain.你需要做一些事情:

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);
Run Code Online (Sandbox Code Playgroud)

要不就:

f_string anArray[MAX_FIELDS] = {"Hello, Bob", "this is dumb, k"};
Run Code Online (Sandbox Code Playgroud)

  • 注意,除非数组在`aLine.field [i] [MAX_CHARS]`上已经有一个''\ 0',否则这不一定是空终止字符串. (2认同)