C 有条件地列出字符串数组
我试图在C中列出给定目录中的所有文件和文件夹,下面的代码错误被排除,我无法找出是什么错误C 有条件地列出字符串数组,c,arrays,string,C,Arrays,String,我试图在C中列出给定目录中的所有文件和文件夹,下面的代码错误被排除,我无法找出是什么错误 #include <sys/types.h> #include <dirent.h> #include <regex.h> #include <stdio.h> #include <unistd.h> #include <pwd.h> enum { WALK_OK = 0, WALK_BADPATTERN,
#include <sys/types.h>
#include <dirent.h>
#include <regex.h>
#include <stdio.h>
#include <unistd.h>
#include <pwd.h>
enum {
WALK_OK = 0,
WALK_BADPATTERN,
WALK_BADOPEN,
};
int walk_directories(const char *dir, const char *pattern, char* strings[])
{
struct dirent *entry;
regex_t reg;
DIR *d;
int i = 0;
//char array[256][256];
if (regcomp(®, pattern, REG_EXTENDED | REG_NOSUB))
return WALK_BADPATTERN;
if (!(d = opendir(dir)))
return WALK_BADOPEN;
while (entry = readdir(d))
if (!regexec(®, entry->d_name, 0, NULL, 0) )
//puts(entry->d_name);
strings[i] = (entry->d_name);
i++;
closedir(d);
regfree(®);
return WALK_OK;
}
void main()
{
struct passwd *pw = getpwuid(getuid());
char *homedir = pw->pw_dir;
strcat(homedir, "/.themes");
int n = 0;
char *array[256][100];
char *array2[256][100];
walk_directories(homedir, "", array);
for (n = 0; n < 256; n++)
{
//do stuff here later, but just print it for now
printf ("%s\n", array[n]);
}
walk_directories("/usr/share/themes", "", array2);
for (n = 0; n < 256; n++)
{
//do stuff here later, but just print it for now
printf ("%s\n", array2[n]);
}
}
如果有帮助的话,我已经在python中实现了我想要的,这是C语言所期望的结果
import os
DATA_DIR = "/usr/share"
def walk_directories(dirs, filter_func):
valid = []
try:
for thdir in dirs:
if os.path.isdir(thdir):
for t in os.listdir(thdir):
if filter_func(os.path.join(thdir, t)):
valid.append(t)
except:
logging.critical("Error parsing directories", exc_info=True)
return valid
def _get_valid_themes():
""" Only shows themes that have variations for gtk+-3 and gtk+-2 """
dirs = ( os.path.join(DATA_DIR, "themes"),
os.path.join(os.path.expanduser("~"), ".themes"))
valid = walk_directories(dirs, lambda d:
os.path.exists(os.path.join(d, "gtk-2.0")) and \
os.path.exists(os.path.join(d, "gtk-3.0")))
return valid
print(_get_valid_themes())
多谢各位
[编辑]
谢谢你的帮助,我现在唯一的问题是printf的所有吐出来的垃圾,而不是我所期望的,我尝试了一些事情,而while循环现在看起来像这样
while (entry = readdir(d))
if (!regexec(®, entry->d_name, 0, NULL, 0) )
//printf("%s\n",entry->d_name);
strcpy(strings[i], (entry->d_name));
//strings[i] = (entry->d_name);
printf("%i\n",i);
i++;
closedir(d);
我也没有得到正确的打印,这是我从3个printf语句中得到的全部信息
0
Adwaita2
\@
0
Radiance
��
\@
�K��
� `���
����
�
��
�
.N=
�O��
�
�
如果我启用
printf("%s\n",entry->d_name);
然后它打印出预期的输出
string.h
,以获取strcat(3)
的声明int walk_directories(const char *dir, const char *pattern, char* strings[])
char*strings[]
只是语法上的糖,意思是char**strings
。因为要传递一个2D数组,所以这不起作用。在我看来,您打算创建两个字符串数组,但这些声明并不是这样做的:
char *array[256][100];
char *array2[256][100];
您可能不希望*
在那里。如果您将其取下,您可以将walk\u目录的签名更改为:
int walk_directories(const char *dir, const char *pattern, char strings[][100])
它应该可以工作,在你的函数中进行必要的修改以匹配。作为奖励,此更改将使您的printf
调用也开始工作
循环体周围缺少了一些大括号
第一个警告表示编译器无法确定
strcat()
函数应该接受哪些参数。由于这是一个标准的C函数,因此此警告意味着您缺少#include
指令。具体来说,您需要#包括。当您修复此问题时,可能会发现您收到不同的错误和警告,因此请从中着手。实际上,您没有任何错误。您得到的诊断类型称为“警告”,您可以通过包括
来解决它。谷歌。@H2CO3,他确实有一些错误,只是编译器称之为警告。例如,它显示的不匹配指针警告将导致奇怪的操作。我会称之为程序中的错误,即使编译器认为它们是“警告”而不是“错误”。@CarlNorum在这种情况下,他也应该发布错误。(不管怎么说,你是对的,我们也应该注意警告,但还是…措辞…)还有,void main()
?Barf.现在printf调用出现了一个小问题,我把它添加到了主要问题中,它们似乎只输出垃圾字符,while循环中的代码似乎存在一些问题。如果在执行strcpy的循环中打印字符串,它们是对的吗?你用所有256个字符串填充数组吗?是的,对了,我没有填充所有256个字符串不,我只是选择了它,因为它比我得到的数组数量还要多,似乎大括号是问题所在,再次感谢:)
int walk_directories(const char *dir, const char *pattern, char strings[][100])