1 #include <stdio.h>
2 #include <string.h>
3
4
5 int readChar();
6 int readInt(int c);
7 int readCodes();
8
9 /*
10 1.讀取字符時候如何過濾掉換行符號,兼容類unix和windows操作系統 readChar()
11 2.熟練掌握將二進制字符串映射到數組的數據結構,這個數據結構是個二元組,我們可以用該二元組唯一確定一個長度為len的二進制字符串
12 (len, value) ---- > code[len][value]
13
14 */
15
16 int main() {
17
18
19 while ( readCodes() ) { // 讀編碼頭
20
21 for (;;) { // 讀信息
22
23 int len = readInt(3);
24 if (0 == len) break; // 全0該信息結束
25
26 for (;;) { // 讀信息段
27
28 int v = readInt(len);
29
30 if (v == (1 << len) - 1) break; // 全1一個信息段結束
31 putchar(code[len][v]);
32
33 }
34
35 }
36
37 putchar('\n');
38 }
39 }
40
41
42 int readInt(int l) {
43
44 int v = 0;
45 //已經讀取了3 - l個字符
46 while (l--) {
47
48 v = v * 2 + readChar() - '0';
49
50 }
51 return v;
52
53 }
54
55
56 char readChar() {
57
58 char ch;
59 do {
60
61 ch = getchar();
62
63 }while ( '\n' != ch || '\r' != ch )
64 return ch;
65 }
66
67
68 int readCodes() {
69
70
71 memset(code, 0, sizeof(code));
72
73 // 因為可能讀取編碼頭獨占一行,所以我們可能讀取編碼頭時候會讀取到上一次的回車換行,所以要使用readChar函數
74 code[1][0] = readChar();
75
76 for (int len = 2; len < 8; len++) {
77
78 for (int v = 0; v < (1 << len) - 1; v++) {
79
80 char ch = getchar();
81 if ( EOF == ch ) return 0;
82 if ( '\n' == ch || '\r' == ch) return 1;
83 code[len][v] = ch;
84
85 }
86
87 }
88 return 1;
89
90
91 }