C语言中的数组问题
我很困惑。在while循环中,我将每个文件名添加到一个数组中,然后打印它 但是,在for循环中,它会打印一些奇怪的东西,并停止在中间执行。 请帮我修一下C语言中的数组问题,c,arrays,C,Arrays,我很困惑。在while循环中,我将每个文件名添加到一个数组中,然后打印它 但是,在for循环中,它会打印一些奇怪的东西,并停止在中间执行。 请帮我修一下 char *commands[1000]; char *str; DIR * dir; struct dirent * entry; char *env = getenv("PATH"); do { str = strsep(&env, ":"); if(str != NULL) if(strl
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
}
char*命令[1000];
char*str;
DIR*DIR;
结构方向*条目;
char*env=getenv(“路径”);
做{
str=strep(&env,“:”);
如果(str!=NULL)
如果(strlen(newEnv)>0){
dir=opendir(str);
如果(dir==NULL)中断;
flag=0;
while((entry=readdir(dir))!=NULL){
命令[++count]=条目->数据单元名称;
printf(“--%i%s\n”,count,命令[count]);//打印良好
}
closedir(dir);//关闭目录
}
}while(newEnv);
命令[++count]='\0';
printf(“计数=:%i\n”,计数);
for(int i=0;i
您正在设置指向readdir
接收的dir
结构的指针。但是,该结构是
您需要复制字符串(
strdup
和friends)。您正在设置指向readdir
接收的dir
结构的指针。但是,该结构是
您需要复制字符串(
strdup
和friends)。commands[++count]=entry->d_name
不会将entry->d_name
字符串复制到commands[++count]
,而只是分配指针。在下一次迭代中,entry->d_name
被覆盖,因为readdir
使用静态内存返回结果
改为使用strcpy,自己分配内存。
命令[++count]=entry->d_name
不会将条目->d_name
字符串复制到命令[++count]
,而只是分配指针。在下一次迭代中,entry->d_name
被覆盖,因为readdir
使用静态内存返回结果
改用strcpy,自己分配内存。问题:
- 您向数组添加指针,这些指针指向将由
稍后释放的字符串readdir/closedir
- 如果
的起始值为0,count
永远不会分配给垃圾并且包含垃圾commands[0]
命令[++count]='\0'代码>行似乎是一个错误,但幸运的是它将
增加1,因此计数
行打印正确的数字,而打印计数
循环在正确的范围内迭代for
- 您向数组添加指针,这些指针指向将由
稍后释放的字符串readdir/closedir
- 如果
的起始值为0,count
永远不会分配给垃圾并且包含垃圾commands[0]
命令[++count]='\0'代码>行似乎是一个错误,但幸运的是它将
增加1,因此计数
行打印正确的数字,而打印计数
循环在正确的范围内迭代for
- 问题:
在最后一个循环中,您不应该依赖于使用空值初始化的“commands”数组。除了@Eugene Homyakov的答案之外:
在最后一个循环中,您不应该依赖“commands”数组来初始化空值。请尝试构造一个最小的测试用例(请参阅)。与
opendir
等相关的所有内容可能与问题无关,因此您可能可以将其从代码段中删除。请注意,对环境变量使用strep
是不安全的,因为它会修改它们。然而,这不是问题的根源。正确缩进的源代码有很大帮助。。。这个newEnv
变量是什么?为什么要跳过第一个数组元素?您的代码没有编译为newEnv
,标志
和计数
<代码>strep()也找不到,但这可能是因为我没有包含正确的include文件。它是哪一个?请尝试构造一个最小的测试用例(请参阅)。与opendir
等相关的所有内容可能与问题无关,因此您可能可以将其从代码段中删除。请注意,对环境变量使用strep
是不安全的,因为它会修改它们。然而,这不是问题的根源。正确缩进的源代码有很大帮助。。。这个newEnv
变量是什么?为什么要跳过第一个数组元素?您的代码没有编译为newEnv
,标志
和计数
<代码>strep()也找不到,但这可能是因为我没有包含正确的include文件。它是哪一个?替换命令[++count]=entry->d_name代码>通过命令[++count]=strdup(条目->数据单元名称)代码>.ok这似乎很好,但for循环由于某种原因没有执行??我想,这是因为您从未设置命令[0]。所以它很可能是0,并导致循环立即中断。在写入数组后,应该考虑递增计数,删除那个(然后)无用的行“<代码>命令[++计数]=‘0’;”,并注意MatthieuW指出的。我的意思是,替换<代码>命令[++计数] =条目> dYNEX;printf(“--%i%s\n”,count,命令[count])代码>通过命令[count++]=entry->d_name;printf(“--%i%s\n”,count,命令[count-1])代码>(假设您稍后将删除printf)。替换命令[++count]=entry->d_name代码>通过命令[++count]=strdup(条目->数据单元名称)代码>.ok这似乎很好,但for循环由于某种原因没有执行??我想,这是因为您从未设置命令[0]。所以很可能