回答編集履歴

2

ソース追記

2019/11/02 02:27

投稿

cateye
cateye

スコア6851

test CHANGED
@@ -19,3 +19,313 @@
19
19
  エラー処理
20
20
 
21
21
  }
22
+
23
+
24
+
25
+ 『追記』BAが出ていますが、取り敢えず^^
26
+
27
+ ```text
28
+
29
+ usr ~/Project/test % ./a.out
30
+
31
+ N:? 3
32
+
33
+ 12:34:56
34
+
35
+ 23:59:00
36
+
37
+ 20:00:60
38
+
39
+ 12:34:56
40
+
41
+
42
+
43
+ correct time
44
+
45
+
46
+
47
+ 23:59:00
48
+
49
+
50
+
51
+ correct time
52
+
53
+
54
+
55
+ 20:00:60
56
+
57
+
58
+
59
+ incorrect time
60
+
61
+ ```
62
+
63
+ ```c
64
+
65
+ #include <stdio.h>
66
+
67
+ #include <string.h>
68
+
69
+ #include <ctype.h>
70
+
71
+ //
72
+
73
+ #define ARRY_SIZE (64)
74
+
75
+
76
+
77
+ int input(void);
78
+
79
+ void timecheck(int a, const char array[][ARRY_SIZE], int f[]);
80
+
81
+ int lettercheck(const char array[ARRY_SIZE]);
82
+
83
+ int formatcheck(const char array[ARRY_SIZE]);
84
+
85
+ int numbercheck(const char array[ARRY_SIZE]);
86
+
87
+ void output(int e, char array[][ARRY_SIZE], int k[]);
88
+
89
+ enum {
90
+
91
+ NML_END,
92
+
93
+ CorrectTime,
94
+
95
+ ValidFormat,
96
+
97
+ IncorrectTime,
98
+
99
+ InvalidFormat
100
+
101
+ };
102
+
103
+
104
+
105
+ int main(void)
106
+
107
+ {
108
+
109
+ int N, i;
110
+
111
+ N = input();
112
+
113
+ char timestamps[N][ARRY_SIZE];
114
+
115
+ int check[N];
116
+
117
+ for (i = 0; i < N; i++) {
118
+
119
+ check[i] = NML_END;
120
+
121
+ fgets(timestamps[i], ARRY_SIZE, stdin);
122
+
123
+ }
124
+
125
+
126
+
127
+ timecheck(N, timestamps, check);
128
+
129
+ output(N, timestamps, check);
130
+
131
+ return 0;
132
+
133
+ }
134
+
135
+ //
136
+
137
+ int input(void)
138
+
139
+ {
140
+
141
+ int x;
142
+
143
+ fputs("N:? ", stdout);
144
+
145
+ scanf("%d\n", &x);
146
+
147
+ return x;
148
+
149
+ }
150
+
151
+ //
152
+
153
+ void timecheck(int a, const char array[][ARRY_SIZE], int f[])
154
+
155
+ {
156
+
157
+ for (int i = 0; i < a; i++) {
158
+
159
+ // puts("formatcheck");
160
+
161
+ if ((f[i] = formatcheck(array[i])) == CorrectTime) {
162
+
163
+ // puts("lettercheck");
164
+
165
+ if ((f[i] = lettercheck(array[i])) == CorrectTime) {
166
+
167
+ // puts("numbercheck");
168
+
169
+ f[i] = numbercheck(array[i]);
170
+
171
+ }
172
+
173
+ }
174
+
175
+ }
176
+
177
+ }
178
+
179
+
180
+
181
+ int formatcheck(const char array[])
182
+
183
+ {
184
+
185
+ int h, m, s;
186
+
187
+ if (sscanf(array, "%2d:%2d:%2d", &h, &m, &s) != 3) {
188
+
189
+ // puts(array);
190
+
191
+ return InvalidFormat;
192
+
193
+ }
194
+
195
+ // printf("%2d-%2d-%2d\n",h,m,s);
196
+
197
+ return CorrectTime;
198
+
199
+ }
200
+
201
+
202
+
203
+ int lettercheck(const char array[])
204
+
205
+ {
206
+
207
+ const static int pos[] = {0, 1, 3, 4, 6, 7};
208
+
209
+
210
+
211
+ for (int i = 0; i < 5; i++) {
212
+
213
+ if (!isdigit(array[pos[i]])) {
214
+
215
+ return ValidFormat;
216
+
217
+ }
218
+
219
+ }
220
+
221
+ return CorrectTime;
222
+
223
+ }
224
+
225
+
226
+
227
+ int numbercheck(const char array[])
228
+
229
+ {
230
+
231
+
232
+
233
+ if (!isdigit(array[0]) || array[0] > '2') {
234
+
235
+ // puts("1");
236
+
237
+ return IncorrectTime;
238
+
239
+ }
240
+
241
+ if (!isdigit(array[1])) {
242
+
243
+ // puts("2");
244
+
245
+ return IncorrectTime;
246
+
247
+ }
248
+
249
+ if (!isdigit(array[3]) || array[3] > '5') {
250
+
251
+ // puts("3");
252
+
253
+ return IncorrectTime;
254
+
255
+ }
256
+
257
+ if (!isdigit(array[4])) {
258
+
259
+ // puts("4");
260
+
261
+ return IncorrectTime;
262
+
263
+ }
264
+
265
+ if (!isdigit(array[6]) || array[6] > '5') {
266
+
267
+ // puts("5");
268
+
269
+ return IncorrectTime;
270
+
271
+ }
272
+
273
+ if (!isdigit(array[7])) {
274
+
275
+ // puts("6");
276
+
277
+ return IncorrectTime;
278
+
279
+ }
280
+
281
+
282
+
283
+ return CorrectTime;
284
+
285
+ }
286
+
287
+
288
+
289
+ void output(int e, char array[][ARRY_SIZE], int k[])
290
+
291
+ {
292
+
293
+ for (int i = 0; i < e; i++) {
294
+
295
+ if (k[i] == CorrectTime) {
296
+
297
+ puts(array[i]);
298
+
299
+ puts(" correct time\n");
300
+
301
+ } else if (k[i] == ValidFormat) {
302
+
303
+ puts(array[i]);
304
+
305
+ puts(" valid format\n");
306
+
307
+ } else if (k[i] == IncorrectTime) {
308
+
309
+ puts(array[i]);
310
+
311
+ puts(" incorrect time\n");
312
+
313
+ } else if (k[i] == InvalidFormat) {
314
+
315
+ puts(array[i]);
316
+
317
+ puts(" invalid format\n");
318
+
319
+ }
320
+
321
+ }
322
+
323
+ }
324
+
325
+
326
+
327
+ ```
328
+
329
+ 修正すべき所は多々有ると思いますが、まあ動くので・・・
330
+
331
+ #いろいろなフォーマットのテストをされたほうが良いと思います。

1

追記

2019/11/02 02:27

投稿

cateye
cateye

スコア6851

test CHANGED
@@ -1,9 +1,21 @@
1
+ C可変長の配列↓が利用できるのは
2
+
3
+ char timestamps[N][81];
4
+
5
+ int check[N];
6
+
1
- 普通に考えると
7
+ 特定のコンパイラのみです、
8
+
9
+ [C言語(C11)で可変長の配列を使う方法](https://qiita.com/raccy/items/bfcb62086c5f027d57b6)
10
+
11
+ また、↑にも有りますが、C++14の仕様には含まれていません。
12
+
13
+
14
+
15
+ で、フォーマットチェックは下記で出来るのでは?
2
16
 
3
17
  if(scanf("%d:%d:%d",&h,&m,&s) != 3){
4
18
 
5
19
  エラー処理
6
20
 
7
21
  }
8
-
9
- で、フォーマットチェックが出来るのでは?