C言語で書いてみました

過去の情報処理技術者試験の出題をもとにして、Cのソースを起こしてみました。

■ 文字列の圧縮と復元(平成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;
}