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