3-3 expand.c

ありきたり?
なんてオーバーフローが怖い関数…。

/*
 * P59 演習3-3
 *   文字列s1中のa-zのような省略記法を、それと等価な
 *   完全リストabc……xyzにしてs2中に展開する関数
 *   expand(s1, s2)を書け。大文字、小文字、数字を許し、
 *   a-b-cやa-z0-9や-a-zのような場合も処理できるようにせよ。
 *   先頭および最後の-は文字とみなすことにする。
 *
 *         2007/09/08 arikui
 */

#include <stdio.h>

char* expand(const char *s1, char *s2){
    int i = 0, j = 0, c;
    
    while((c = s1[i++]) != '\0'){
        if (s1[i] == '-'){
            if (s1[++i] == '\0'){   //at right tip
                s2[j++] = c;
                s2[j++] = '-';
            }else{
                for(; c < s1[i]; c++)
                    s2[j++] = c;
            }
        }else{
            s2[j++] = c;
        }
    }
    
    s2[j] = '\0';
    return s2;
}


//Test Driver
#define BUFFER_LEN 1024

int main(void){
    char buf[BUFFER_LEN];
    char tests[2][BUFFER_LEN] = {
        "-a-z-",
        "a-b-c0-9"
    };
    int size = sizeof(tests) / BUFFER_LEN;
    int i;
    
    for(i = 0; i < size; i++)
        puts(expand(tests[i], buf));
    
    return 0;
}