将结构体数组设置为null

4

非常抱歉如果我有点混乱。

我正在尝试从输入文件中读取值并填充一个结构体数组。我没有任何问题读取文件中的值。但是当文件非常小,无法完全填充数组时,剩余的结构体会有随机值,我希望将这些结构体完全设置为NULL。我试图这样做是因为我想遍历填充好的结构体数组并打印它的值,我需要知道哪些数组值是来自于文件。

以下是我的代码:

struct function {
    char name[20];
    int parameterNumer;

};


int main(int argc, const char * argv[])
{
    struct function functionList[10];
    int i =0, j;
    int portNumber;
    char *configFile = argv[1];
    FILE *fp;

    fp = fopen(configFile, "r");
    if(fp == NULL) {
        perror("File not found");
        exit(1);
    }

    fscanf(fp, "%d", &portNumber);
    while(fscanf(fp, "%s %d", functionList[i].name, &functionList[i].parameterNumer) == 2) {
        i++;
    }
    functionList[i] = NULL; //getting an error here

    for(j = 0; functionList[j] != NULL; j++) {  //and here
        printf("%s %d", functionList[j].name, &functionList[j].parameterNumer);
    }


    return 0;

}

你没有检查 i 是否在数组边界内(在这种情况下,0 <= i <= 9)。while 循环可能会将 i 增加到 10,而 functionList[10] 不存在。 - ccKep
你不能将结构体设置为 NULLNULL 是一个指针值。要么为你的结构体定义一些特殊的值来表示缺失的数据,要么跟踪你的数组中当前有效的元素数量(或哪些元素是有效的)。 - Keith Thompson
3个回答

3

初始化数组:

/* Remaining elements zero-d. */
struct function functionList[10] = { { "", 0 } };

如果空字符串或零表示数组中未填充的条目,则使用空字符串或零 int 终止 for 循环:

for(j = 0; strlen(functionList[j].name); j++) {

for(j = 0; functionList[j].parameterNumber; j++) {

此外,在while中,还要防止对functionList的越界访问:
while(i < 10 && fscanf(fp,
                       "%s %d",
                       functionList[i].name,
                       &functionList[i].parameterNumer) == 2)
{
    i++;
}

请注意,此 while 循环结束后的 i 值也将成为接下来的 for 循环的终止条件。
for (j = 0; j < i; j++) {

2

您还可以使用memset

memset(functionList, 0, sizeof(functionList));

2

您可以使用calloc()创建数组

struct function* functionList = calloc(sizeof(struct function), 10);

将指向数组的指针更改为此处引用的指针,以此方式创建具有全部零值的结构体。


2
但是,除非您希望将其编译为C++,否则不要转换calloc的返回值(只需使用functionList = calloc(...)即可)。 - James M
2
@JamesMcLaughlin 你说得对,我更新了答案(未来读者可参考https://dev59.com/dHRB5IYBdhLWcg3wgHWr) - gipi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接