我很困惑。在while循环中,我将每个文件名添加到一个数组中,然后将其打印出来。
然而,在for循环中,它打印出一些奇怪的东西并停止在中间执行。
请帮我解决。
char *commands[1000];
char *str;
DIR * dir;
struct dirent * entry;
char *env = getenv("PATH");
do {
str = strsep(&env, ":");
if(str != NULL)
if(strlen(newEnv) > 0) {
dir = opendir(str);
if( dir == NULL ) break;
flag = 0;
while((entry = readdir(dir)) != NULL) {
commands[++count] = entry->d_name;
printf("---%i %s\n", count ,commands[count]); // prints fine
}
closedir(dir); // close directory
}
} while(newEnv);
commands[++count] = '\0';
printf("count = : %i\n", count);
for(int i = 0; i < count; i ++)
{
if(commands[i] == NULL)
break;
printf("aaa%i %s\n\n", i, commands[i]); //problem loop
}
答案 0 :(得分:2)
您正在设置指向dir
收到的readdir
结构的指针。但是,该结构是deallocated by closedir
。
您需要复制字符串(strdup
和朋友)。
答案 1 :(得分:2)
commands[++count] = entry->d_name
不会将entry->d_name
字符串复制到commands[++count]
,而只是指定指针。在下一次迭代中,entry->d_name
被覆盖,因为readdir
使用静态内存来返回结果。
使用strcpy
代替并自行分配内存。
答案 2 :(得分:0)
问题:
readdir/closedir
解除分配的字符串
count
的起始值为0,则永远不会将commands[0]
分配给并包含垃圾commands[++count] = '\0';
行似乎是一个错误,但幸运的是它向count
添加了1,因此print count
行打印正确的数字,for
循环遍历右侧范围答案 3 :(得分:0)
除了@Eugene Homyakov的回答:
您不应该依赖于使用NULL值初始化“commands”数组的最后一个循环。