POJ 3428 - Formatting function

http://poj.org/problem?id=3428

概要

printf ライクなフォーマット文字列とそれに対する引数が与えられるので,その結果を答える.

フォーマット指示子の意味は以下の通り.

ただし,以下の場合はフォーマットエラーなので「ERROR」とのみ出力する.

制約

解法

やるだけ. 引数として空文字列(空行)というのもアリで,%s のときは有効だが %d のときは不正なので ERROR と出力する点に注意.

 1 #include <stdio.h>
 2 #include <ctype.h>
 3 
 4 int check(const char *p, char args[1000][50010])
 5 {
 6   int c = 0;
 7   while (*p != '\0' && *p != '\n') {
 8     if (*p == '%') {
 9       ++p;
10       if (*p == 'd') {
11         if (args[c][0] == '\0' || args[c][0] == '\n') {
12           return -1;
13         }
14         int i;
15         for (i = 0; args[c][i] != '\0' && args[c][i] != '\n'; i++) {
16           if (!isdigit(args[c][i])) {
17             return -1;
18           }
19         }
20         ++c;
21       } else if (*p == 's') {
22         ++c;
23       } else if (*p == '%') {
24       } else {
25         return -1;
26       }
27     }
28     ++p;
29   }
30   return c;
31 }
32 
33 void format(const char *p, char args[1000][50010])
34 {
35   int c = 0;
36   while (*p != '\0' && *p != '\n') {
37     if (*p == '%') {
38       ++p;
39       if (*p == 'd') {
40         int i;
41         for (i = 0; args[c][i] != '\0' && args[c][i] != '\n' && args[c][i] == '0'; i++);
42         if (args[c][i] == '\0' || args[c][i] == '\n') {
43           putchar('0');
44         } else {
45           for (; args[c][i] != '\0' && args[c][i] != '\n'; i++) {
46             putchar(args[c][i]);
47           }
48         }
49         ++c;
50       } else if (*p == 's') {
51         int i;
52         for (i = 0; args[c][i] != '\0' && args[c][i] != '\n'; i++) {
53           putchar(args[c][i]);
54         }
55         ++c;
56       } else {
57         putchar('%');
58       }
59     } else {
60       putchar(*p);
61     }
62     ++p;
63   }
64   putchar('\n');
65 }
66 
67 int main(void)
68 {
69   static char fmt[50010];
70   fgets(fmt, sizeof fmt, stdin);
71   static char args[1000][50010];
72   int N = 0;
73   while (fgets(args[N], sizeof args[N], stdin) != NULL) {
74     N++;
75   }
76   if (check(fmt, args) != N) {
77     puts("ERROR");
78   } else {
79     format(fmt, args);
80   }
81   return 0;
82 }
poj/3428.c