【问题标题】:Save filenames in array in C将文件名保存在C中的数组中
【发布时间】:2014-12-27 20:19:50
【问题描述】:

我有这个功能:

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) 发送这个数组

【问题讨论】:

  • 使用需要使用二维数组或指针数组。
  • 我不能使用指针数组,因为我稍后需要将此数组发送给客户端。
  • 当你说“发送”时,你是什么意思?
  • @JacobÅkerblom:所以?为什么你不能处理?此外:void f_listfiles(char temp[200]) 应该是 void f_listfiles( char *temp),因为当您将数组传递给函数时,它们会衰减为指针
  • 您的 temp 数组可以容纳 199 个字符。因此,无论如何,如果您目录中所有文件的长度总和超过 199(这很可能发生),您将无法将所有文件名存储在您的数组中。

标签: c arrays filenames winsock send


【解决方案1】:

我希望它把目录中的文件名放入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]);
}

我稍后需要将此数组发送给客户端

发送此数组的代码需要以某种方式对其进行序列化 - 比如说,在发送之前将字符串一个接一个地附加到字符缓冲区。

【讨论】:

  • 请注意,如果您以后只需要加入字符串数组,则不需要字符串数组。您可以将它们全部复制到一个一维数组中,并保留一个指针,该指针将按最后复制的字符串的长度递增。
【解决方案2】:

除了 temp 可能太小而无法处理或字符串之外,您可以执行以下操作来克服 overwrite 问题:

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);
}

有一个catchstrcat 将覆盖 temp 字符串的 terminating null character 并在结果字符串的末尾追加一个新的

【讨论】:

    猜你喜欢
    • 2021-10-11
    • 2022-06-30
    • 2019-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-02
    • 2017-02-18
    • 1970-01-01
    相关资源
    最近更新 更多