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,

我试图在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,
    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(&reg, pattern, REG_EXTENDED | REG_NOSUB))
    return WALK_BADPATTERN;
    if (!(d = opendir(dir)))
    return WALK_BADOPEN;
    while (entry = readdir(d))
    if (!regexec(&reg, entry->d_name, 0, NULL, 0) )
            //puts(entry->d_name);
        strings[i] = (entry->d_name);
        i++;
    closedir(d);
    regfree(&reg);

    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(&reg, 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])