■ 文字列の圧縮と復元(平成12年午後問2)
#include <stdio.h>
/* 一種平成12年午後問2 */
/* 文字列の長さを取得 */
int _strlen(const char *s)
{
int c = 0;
while (*s++ != '\0') c++;
return c;
}
/* 配列の内容を表示 */
void print_array(char *s)
{
char buf[3];
while (*s != '\0') {
if (*s >= 4 && *s <= 15) {
sprintf(buf, "%x", *s);
printf("%s", buf);
} else {
putchar(*s);
}
s++;
}
putchar('\n');
}
int main()
{
char X[128], Y[128], Z[128];
char h;
int p = -1, n = 0, L, M, i;
printf("ソース:");
gets(X);
/* 文字列圧縮処理 */
h = X[0];
L = _strlen(X);
for (i = 0; i < L; i++) {
if (h != X[i]) {
if (n >= 4) {
Y[p-1] = '*';
Y[p] = n;
}
p++;
Y[p] = X[i];
h = X[i];
n = 1;
} else {
n++;
if (n >= 4) {
if (i == L - 1) {
Y[p-1] = '*';
Y[p] = n;
}
} else {
p++;
Y[p] = X[i];
}
}
}
Y[p+1] = '\0';
printf("圧縮後:");
print_array(Y);
/* 文字列復元処理 */
Z[0] = Y[0];
M = _strlen(Y);
i = 0;
for (p = 1; p < M; p++) {
if (Y[p] == '*') {
for (n = 2; n <= Y[p+1]; n++) {
i++;
Z[i] = Y[p-1];
}
} else {
if (Y[p-1] != '*') {
i++;
Z[i] = Y[p];
}
}
}
Z[i+1] = '\0';
printf("復元後:");
print_array(Z);
return 0;
}