![](/img/trans.png)
[英]Get filenames from current dir, save into char ** array, glob, C, seg fault
[英]Save filenames in array in C
我有这个功能:
void f_listfiles(char temp[200]){
HANDLE hFind;
WIN32_FIND_DATA FindData;
int i;
hFind = FindFirstFile("*", &FindData);
while (FindNextFile(hFind, &FindData))
{
strcpy(temp, FindData.cFileName);
}
FindClose(hFind);
}
我希望它将目录中的文件名放入char temp中。 之后,我将其发送到FTP客户端。 我怎样才能做到这一点? 当前每次都会覆盖它,并且只有最后一个文件处于char temp中。
编辑:我不能使用指针数组,因为我以后需要使用函数send(clientSocket,temp,sizeof(temp),0)发送该数组
我希望它将目录中的文件名放入
char temp[]
那是行不通的:字符数组是单个字符串; 您需要一个字符串数组。
也就是说,您需要一个指针数组。 有几种使它起作用的方法。 一种是让调用者传递一个数组及其长度,以避免溢出,然后随需动态分配字符串。 您需要返回您填写的条目数,否则调用者将不知道实际文件名在数组中的何处结束。
size_t f_listfiles(char *names[], size_t max) {
HANDLE hFind;
WIN32_FIND_DATA FindData;
size_t i = 0;
hFind = FindFirstFile("*", &FindData);
while (FindNextFile(hFind, &FindData) && i != max)
{
names[i] = malloc(strlen(FindData.cFileName)+1);
strcpy(names[i], FindData.cFileName);
i++;
}
FindClose(hFind);
return i;
}
调用者将这样调用您的函数:
char *names[200];
size_t count = f_listfiles(names, 200);
for (size_t i = 0 ; i != count ; i++) {
printf("%02d: %s\n", i+1, names[i]);
}
// Caller needs to free dynamically allocated strings:
for (size_t i = 0 ; i != count ; i++) {
free(names[i]);
}
我以后需要将此数组发送给客户端
发送此数组的代码将需要以某种方式对其进行序列化-例如,在发送之前,将字符串一个接一个地附加到字符缓冲区。
除了温度可能太小而无法处理字符串之外,您还可以执行以下操作来克服覆盖问题:
int i = 0;
while (FindNextFile(hFind, &FindData))
{
if(i == 0){
strcpy(temp, FindData.cFileName);
i++;
continue;
}
strcat(temp, FindData.cFileName);
}
要么
temp[0] = 0; //terminating null character so strcat can join the strings
while (FindNextFile(hFind, &FindData))
{
strcat(temp, FindData.cFileName);
}
不过有一个陷阱 。 strcat
将覆盖临时字符串的terminating null character
,并在结果字符串的末尾追加一个新的terminating null character
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.