所以这是一个真正的初学者问题,但我完全迷失了。我试图在文件夹中生成文件名的字符串数组,以便我可以遍历每个文件并提取一些信息。由于文件数量和文件名长度不固定,我需要动态分配数组。这是到目前为止的代码,它从文件夹中获取文件名,但在尝试将名称分配给数组时会出现错误。
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不会这样,所以我很困难。任何帮助将不胜感激。
答案 0 :(得分:1)
不,您的malloc()
来电初始化*lnames
,而不是lnames
。在这样做时,它使用lnames
的值,它确实尚未初始化。
您需要额外的是为lnames
数组分配一些空间。每次添加文件名时,都需要变长。
出于效率原因,您可能希望分批进行,而不是每次都这样做,但这是一个不错的开始:
添加一个变量,计算到目前为止您拥有的名称数量:
int numnames = 0;
靠近顶部。
更改lnames
的声明以初始化它:
char** lnames = NULL
每次您要添加新名称时,请执行
numnames++;
lnames = realloc(lnames, numnames * sizeof (char *));
不要在malloc()
中存储*lnames
ed字符串(不要转换malloc的结果!),而是使用lnames[numnames - 1]
。
您还应该检查错误(malloc()
和realloc()
可能会失败),但这将是一个良好的开端。
我故意不给你一个完整的“完美”编辑版本的程序,为读者留下一些练习(这对初学者有用; - )