Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中的数组问题_C_Arrays - Fatal编程技术网

C语言中的数组问题

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

我很困惑。在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
}
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
    稍后释放的字符串
  • 如果
    count
    的起始值为0,
    commands[0]
    永远不会分配给垃圾并且包含垃圾
  • 命令[++count]='\0'行似乎是一个错误,但幸运的是它将
    计数
    增加1,因此
    打印计数
    行打印正确的数字,而
    for
    循环在正确的范围内迭代
    • 问题:

      • 您向数组添加指针,这些指针指向将由
        readdir/closedir
        稍后释放的字符串
      • 如果
        count
        的起始值为0,
        commands[0]
        永远不会分配给垃圾并且包含垃圾
      • 命令[++count]='\0'行似乎是一个错误,但幸运的是它将
        计数
        增加1,因此
        打印计数
        行打印正确的数字,而
        for
        循环在正确的范围内迭代

      除了@Eugene Homyakov的回答:


      在最后一个循环中,您不应该依赖于使用空值初始化的“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]。所以很可能