我使用dirent.h
查看var/log
中的所有文件,我想将它们保存在数组中,但是当我保存它们时,它看起来像数字而不是字符串。为什么会这样?
代码在这里:
char *word = ".gz" ;
char *word2 = ".";
char *word3 = "..";
DIR *directory;
struct dirent *dir;
directory = opendir("/var/log");
if (directory) {
while ((dir = readdir(directory)) != NULL)
{
if((strstr(dir->d_name, word) == NULL) && (strstr(dir->d_name, word2) == NULL) && (strstr(dir->d_name, word3) == NULL)) {
printf("%s\n", dir->d_name);
i++;
}
}
printf("%d\n",i);
closedir(directory);
}
char *array_of_files[i];
i=0;
directory = opendir("/var/log");
if (directory) {
while ((dir = readdir(directory)) != NULL)
{
if((strstr(dir->d_name, word) == NULL) && (strstr(dir->d_name, word2) == NULL) && (strstr(dir->d_name, word3) == NULL)) {
array_of_files[i]=dir->d_name;
printf("%d array of file \n",array_of_files[i]);
i++;
}
}
printf("%d\n",i);
int j;
for (j=0;j<i;j++){
printf("%d ", array_of_files[j]);
}
closedir(directory);
首先,我使用计数器计算文件夹中的文件数,然后重新打开目录并使用该计数器创建数组,并开始保存文件夹中的文件名,但它显示只有数字。
这方面的一个例子:
./program
speech-dispatcher
dbconfig-common
apache2
mdm
fsck
samba
aptitude
dmesg
unattended-upgrades
postgresql
udev
installer
cups
hp
btmp
ConsoleKit
syslog
wtmp
mysql
lastlog
23
8962131 8962163 8962283 8962315 8962675 8962755 8962947 8963091 8963155 8963331 8963403 8963539 8963579 8963691 8963755 8964251 8964307 8964435 8964507 8964539 8964571 8964627 8964723
我知道有更好的方法来做阵列而不是两个while循环,但我现在无法想到更好的东西;如果你能推荐一些东西,我们将不胜感激。
答案 0 :(得分:2)
更改以下行
printf("%d array of file \n",array_of_files[i]); to
printf("%s array of file \n",array_of_files[i]);`
并且
printf("%d ", array_of_files[j]); to
printf("%s ", array_of_files[j]);
答案 1 :(得分:2)
使用@SAN所解答的正确格式。
复制指针并没有太大作用,因为dir->d_name
可能会在调用之间重新填充
代码需要创建和管理字符串副本。
char *array_of_files[i];
...
while (...
// array_of_files[i] =dir->d_name;
array_of_files[i] = strdup(dir->d_name);
...
}
}
for (j=0;j<i;j++){
// printf("%d ", array_of_files[j]);
printf("%s ", array_of_files[j]);
free(array_of_files[j]);
}
如果您的系统没有strdup()
,简单到create your own
答案 2 :(得分:0)
你应该使用
printf("%c ", array_of_files[j]);