回答編集履歴

2

バグの報告。scandir を使わないコードの追加

2020/09/01 01:07

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -63,3 +63,65 @@
63
63
  FILE *fp = fopen("xxx.csv", "w"); でファイルをオープンして、
64
64
 
65
65
  printf(...); の代わりに、fprintf(fp, ...); にしてみてください。
66
+
67
+
68
+
69
+ **追記**
70
+
71
+ コードにバグがありました。free(entry[0]); が抜けています。
72
+
73
+
74
+
75
+ scandir の代わりに opendir/readdir/closedir を使っても書けます。
76
+
77
+ ```C
78
+
79
+ #include <stdio.h> // printf
80
+
81
+ #include <stdlib.h> // free
82
+
83
+ #include <string.h> // strrchr, strcasecmp
84
+
85
+ #include <dirent.h> // opendir, readdir, closedir
86
+
87
+
88
+
89
+ int main(int argc, char *argv[])
90
+
91
+ {
92
+
93
+ if (argc != 2) { puts("argc"); return 1; }
94
+
95
+
96
+
97
+ struct dirent **entry;
98
+
99
+ DIR *dp = opendir(argv[1]);
100
+
101
+ if (!dp) { perror("opendir"); return 2; }
102
+
103
+ const char *sep = "";
104
+
105
+ struct dirent *ep;
106
+
107
+ while (ep = readdir(dp)) {
108
+
109
+ const char *p = strrchr(ep->d_name, '.');
110
+
111
+ if (p && !strcasecmp(p, ".ini")) {
112
+
113
+ printf("%s%s", sep, ep->d_name);
114
+
115
+ sep = ",";
116
+
117
+ }
118
+
119
+ }
120
+
121
+ printf("\n");
122
+
123
+ closedir(dp);
124
+
125
+ }
126
+
127
+ ```

1

strlen -> strrchr

2020/09/01 01:07

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -6,21 +6,23 @@
6
6
 
7
7
  #include <stdlib.h> // free
8
8
 
9
- #include <string.h> // strlen, strcasecmp
9
+ #include <string.h> // strrchr, strcasecmp
10
10
 
11
11
  #include <dirent.h> // scandir
12
12
 
13
13
 
14
14
 
15
- int filter(const struct dirent *dp)
15
+ int filter(const struct dirent *ep)
16
16
 
17
17
  {
18
18
 
19
- int len = strlen(dp->d_name);
19
+ const char *p = strrchr(ep->d_name, '.');
20
20
 
21
- return len > 4 && !strcasecmp(dp->d_name + len - 4, ".ini");
21
+ return p && !strcasecmp(p, ".ini");
22
22
 
23
23
  }
24
+
25
+
24
26
 
25
27
 
26
28