簡體   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