我的char * -
数组有问题char *original_file_name_list[500];
while(dp=readdir(dir)) != NULL) {
original_file_name = dp->d_name;
original_file_name_list[counter] = original_file_name;
printf("%s\n",original_file_name_list[0]);
printf("%d\n",counter);
counter++;
}
问题是,它打印所有文件都很好。它应该只打印第一个文件,对吗?
如果我尝试printf("%s\n",original_file_name_list[1]);
它不起作用,这意味着它只在第一个字符串中写入。知道为什么吗?
编辑:由于编译器没有语法错误。
答案 0 :(得分:3)
你根本没有复制字符串 - 你的file_name_list
数组也没有足够的空间容纳文件名列表 - 仅用于指针列表。但是dp->d_name
只是指向char*
的指针 - 你不知道指针后面的内存有多长。因此,你必须为自己制作一份副本。
#include <string.h>
#include <dirent.h>
int main(int argc, char** argv){
char original_file_name_list[50][50];
size_t counter = 0;
while(dp=readdir(dir)) != NULL) // does work fine (ordinary reading files from dir)
{
size_t len = strlen(dp->d_name);
if(len >= 50) len = 49;
strncpy(original_file_name_list[counter], dp->d_name, len);
original_file_name_list[counter][len] = '\0';
printf("%d\n",counter);
counter++;
}
printf("%s\n",original_file_name_list[1]); // <- will work if you have at least 2 files in your directory
return 0;
}
答案 1 :(得分:0)
我不确定counter2
的目的(我已将其替换为counter
)但我可以提出以下代码并strdup()
调用以存储文件名:
char *original_file_name_list[500] = {0}; // it is better to init it here
while(dp=readdir(dir)) != NULL) {
original_file_name_list[counter] = strdup(dp->d_name); // strdup() is ok to use
// here, see the comments
printf("%s\n%d\n",original_file_name_list[counter], counter);
counter++;
}
/* some useful code */
/* don't forget to free the items of list (allocated by strdup(..) )*/
for (int i = 0; i < 500; ++i) {
free(original_file_name_list[i]);
}