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; }