繁体   English   中英

将文件名保存在C中的数组中

[英]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.

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