ANSI C:将元素插入数组

时间:2014-04-02 05:58:57

标签: c arrays ansi

将元素推送到数组的最简单方法是什么?

我有以下代码用于在我的目录中打印文件:

DIR *d;
struct dirent *dir;
d = opendir(".");

if (d) {
    while ((dir = readdir(d)) != NULL) {
        if (dir->d_type == DT_REG) {
            printf("%s\n", dir->d_name);
        }
    }
}
closedir(d);

这是输出:

File1.c
File2.c
File3.c

我想将它们添加到这样的数组中:

arr[] = {"File1.c","File2.c","File3.c"};

所以我可以轻松调用任何给定的项目,例如 arr [1] ,然后获取" File2.c"

我该如何做到这一点?

(几年前我学过C,但现在我不记得怎么做了)

3 个答案:

答案 0 :(得分:1)

您可以在需要时使用malloc()分配空间。您将创建一个指针数组,其中包含您将支持的最大文件数。然后填写由malloc()创建的内存指针,并将值复制到该位置。

char *arr[NUMBER_OF_FILES];
arr[i] = malloc(strlen(*(dir->d_name)) + 1);
strcpy(arr[i], *(dir->d_name));

您可以稍后使用以下方式访问元素:

printf(*(arr[0])) //this will output "File1.c"

<强>更新
正如费迪南德在评论中所建议的那样,使用malloc()可以避免strdup()

char *arr[NUMBER_OF_FILES];
arr[i] = strdup(dir->d_name);
  

重要
  请记住对所有已分配的内存使用free()以避免内存泄漏。

答案 1 :(得分:0)

C不适合容易构建可变大小的集合。基本上有两种方法可以做你想做的事情:

简单,草率的方式:

DIR *d;
char *list[100000];  // More room than you're likely to need
int count = 0;
struct dirent *dir;
d = opendir(".");

if (d) {
    while ((dir = readdir(d)) != NULL) {
        if (dir->d_type == DT_REG) {
            list[count] = strdup(dir->d_name);
            count++;
        }
    }
}
closedir(d);
/* At this point, "count" contains the number of "real" items in your array.
 * Remember to free the memory used by the strings when you're done
 */

更难,更优雅的方式

DIR *d;
char **list = (char **)malloc(8*sizeof(char *));
int count = 0;
int size = 8;
struct dirent *dir;
d = opendir(".");

if (d) {
    while ((dir = readdir(d)) != NULL) {
        if (dir->d_type == DT_REG) {
            if(count > size)            // We've filled up the existing space in the array
            {                           // So make it larger
                size *= 2;              // Doubling each time we run out of room is a good heuristic.
                list = (char **)realloc(size * sizeof(char *));
            }
            list[count] = strdup(dir->d_name);
            count++;
        }
    }
}
closedir(d);
/* At this point, "count" contains the number of "real" items in your array.
 * Remember to free the memory used by the strings and the list when you're done
 */

非常努力,“正确”的方式

写一个“数组”抽象数据类型,其功能包括“推”,“弹出”,“追加”等。详细信息留给学生练习。

答案 2 :(得分:-1)

创建一个足以容纳所有目录的数组。 Char * str [1000] 声明一个索引 Int qq = 0 他们就是这样 Str [qq ++] = name

这将是一个指针数组,因此它不会占用太多内存