文字列巡回置換

こちらの問題に、チャレンジしてみました。m(_ _)m
http://rina.jpn.ph/rance/

[出力結果]

anny	bany	chery	domy
---------------------------
A	B	C	D	
D	A	B	C	
C	D	A	B	
B	C	D	A	
A	B	C	D

put_row()関数は、指定された配列とその分割位置について、
1.分割位置の要素〜配列の最終要素までを表示
2.配列の先頭要素〜分割位置-1の要素までを表示
という処理を行なっています。

また、main()関数からput_row()関数の呼出し時、分割位置を[配列の最終要素+1...0]と先頭方向に移動させています。イメージとしては、以下の通り。

A B C D
        ▲
   ↓
A B C D
      ▲
   ↓
A B C D
    ▲
   ↓
  以下略

※"▲"…分割位置

初回の呼び出しでは、配列の最終要素を超えた分割位置が指定されますが、for文の続行判定で弾かれるため、1のループは実行されません。

[ソースコード]

      1 #include <stdio.h>
      2 
      3 #define NUM_OF(array)       (sizeof(array)/sizeof(*array))
      4 
      5 /*
      6  * Disp array content splited by specified index.
      7  */
      8 void put_row(const char *array, const int element_num, const int split_pos)
      9 {
     10     int i;
     11 
     12     for(i=split_pos; i<element_num; i++){
     13         printf("%c\t", array[i]);
     14     }
     15     for(i=0; i<split_pos; i++){
     16         printf("%c\t", array[i]);
     17     }
     18 }
     19 
     20 int main(void)
     21 {
     22     const char  anny = 'A';
     23     const char  bany = 'B';
     24     const char  chery = 'C';
     25     const char  domy = 'D';
     26     char    array[] = {anny, bany, chery, domy};
     27     int         row;
     28 
     29     /* header */
     30     printf("%s\t%s\t%s\t%s\n", "anny", "bany", "chery", "domy");
     31     printf("---------------------------\n");
     32 
     33     /* content */
     34     for(row=0; row<=NUM_OF(array); row++){
     35         put_row(array, NUM_OF(array), NUM_OF(array) - row);
     36         printf("\n");
     37     }
     38 
     39     return 0;
     40 }