POJ 3428 - Formatting function
http://poj.org/problem?id=3428
概要
printf ライクなフォーマット文字列とそれに対する引数が与えられるので,その結果を答える.
フォーマット指示子の意味は以下の通り.
- %s は引数を文字列として出力する
- %d は leading-zeros 無しの整数値として出力する
- %% は % を出力する
ただし,以下の場合はフォーマットエラーなので「ERROR」とのみ出力する.
- フォーマット文字列に含まれるフォーマット指示子の数と引数の数が異なる
- %d に対応する引数が数字以外の文字を含んでいる
- % の次の文字が s, d, % のいずれでも無い
制約
- 引数の数 <= 1000
- 各行の長さ <= 50000
解法
やるだけ. 引数として空文字列(空行)というのもアリで,%s のときは有効だが %d のときは不正なので ERROR と出力する点に注意.
poj/3428.c1 #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 }