繁体   English   中英

初始化具有未知数字和未知长度的字符串数组

[英]Initialising an array of strings with unknown number and unknown length

所以这是一个真正的初学者问题,但我完全迷失了。 我试图在文件夹中生成文件名字符串的数组,以便随后可以遍历每个文件并提取一些信息。 因为文件的数量和文件名的长度不固定,所以我需要动态分配数组。 到目前为止,这是代码,它从文件夹获取文件名,但是在尝试将名称分配给数组时出错。

int main(int argc, char* argv[])
{
size_t alen;
//input argument is folder path
char src[6], dest[512];
strcpy(src, "*.log");
strcpy(dest, argv[1]);
strcat(dest, src);
int fcount = 0;
char** lnames;

WIN32_FIND_DATA FindFileData;
HANDLE hFind;

hFind = FindFirstFile(dest, &FindFileData);
    while (hFind != INVALID_HANDLE_VALUE)
    {

        alen = strlen(FindFileData.cFileName);
        *lnames = (char*)malloc(sizeof(char)*alen);
        lnames[fcount] = FindFileData.cFileName;
        fcount++;
        if (!FindNextFile(hFind, &FindFileData))
        {
            FindClose(hFind);
            hFind = INVALID_HANDLE_VALUE;
        }
    }
return(0);
}

错误是“正在使用变量'lnames'而不进行初始化”。 但这不是malloc应该做什么吗? 我想到的一种前进方式是使用相同的代码来计算文件数,然后执行以下操作:

char *lnames[fcount];

但是[]值必须是一个常量,它不会是fcount,所以我很困惑。 任何帮助将不胜感激。

不,您的malloc()调用会初始化*lnames ,而不是lnames 这样做时,它会使用lnames的值,该值实际上尚未初始化。

您还需要为lnames数组分配一些空间。 每次添加文件名时,它都需要变长。 出于效率方面的考虑,您不希望每次都分批进行此操作,但这是一个不错的开始:

添加一个变量,该变量计算到目前为止您拥有的名字数:

int numnames = 0;

靠近顶部。

更改lnames的声明以lnames进行初始化:

char** lnames = NULL

每次您要添加新名称时,

numnames++;
lnames = realloc(lnames, numnames * sizeof (char *));

与其将您的malloc() ed字符串(不要转换malloc的结果!)存储在*lnames ,请使用lnames[numnames - 1]

您还应该检查错误( malloc()realloc()可能会失败),但这将是一个不错的开始。

我故意不给您程序的完整“完美”编辑版本,以便给读者一些练习(对初学者来说是好方法;-)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM