#1
18.01.2015 um 14:17 UhrFalls der Browser das Zeichen "®" im Sourcecode (Zeilen 34, 52, 56) anzeigt, muss dies durch "& reg" ersetzt werden (gemeint ist jeweils die Adresse (&) der Struct-Variablen "regex").
C :: Aufgabe #65 :: Lösung #2
Konsolenausgabe:
$ ./filter2 /usr/include 'term.*\.h'
termios.h
term.h
termio.h
term_entry.h
termcap.h
$ ./filter2 -E /var/log '^[a-z]{4}\.log\.[23]\.gz'
kern.log.2.gz
user.log.3.gz
kern.log.3.gz
auth.log.2.gz
user.log.2.gz
dpkg.log.2.gz
dpkg.log.3.gz
auth.log.3.gz
/*****************************************
* filter2.c Dateifilter (Regex Match)
*****************************************/
#include <string.h>
#include <dirent.h>
#include <errno.h>
#include <stdio.h>
#include <sys/types.h>
#include <regex.h>
#define PATH_LEN 255
#define REGX_LEN 255
int main(int argc, char **argv) {
regex_t regex;
DIR* dir;
struct dirent *dire;
char dirpath[PATH_LEN+1];
char pattern[REGX_LEN+1];
int opt_ere=0, opt_ind=1;
if (argc < 3)
return 1;
else {
if (argc == 4 && argv[1][0] == '-' && argv[1][1] == 'E') {
opt_ere = 1;
opt_ind = 2;
}
strncpy(dirpath, argv[opt_ind], PATH_LEN);
strncpy(pattern, argv[opt_ind+1], REGX_LEN);
}
// compile extended regular expression
if (regcomp(®ex, pattern, (opt_ere?REG_EXTENDED:0)|REG_NOSUB) != 0) {
fprintf( stderr, "could not compile regex\n" );
return 2;
}
// open directory
if ((dir = opendir(dirpath)) == NULL) {
fprintf(stderr, "cannot open '%s': %s\n", dirpath,\
strerror(errno));
return 3;
}
// read directory
while ((dire = readdir(dir)) != NULL) {
if (errno > 0) {
fprintf(stderr, "error while reading directory entry: %s\n",\
strerror(errno));
break;
}
if (regexec(®ex, dire->d_name, 0, NULL, 0) == 0)
printf("%s\n", dire->d_name);
}
closedir( dir );
regfree(®ex);
return 0;
}
Kommentare:
devnull
Punkte: 8870
42 Aufgaben
134 Lösungen
16 Kommentare