第39回
プログラミングの周辺事項(2)~きれいでわかりやすいソースとは?

5.機能ごとに空白行を挿入する

1つの関数定義内には、複数の機能や意味が詰まっています。それら機能や意味ごとに空白行で区切れば「どこからどこまでが1つの意味を持つ処理なのか」が一目瞭然になります。

空白は何の意味もない無駄な行ですが、それによって後々のソース解読が楽になります。リスト1は空白行のないソース、リスト2は変数の宣言や繰り返し処理などを空白行で区切ったソースです。元のソースは、本コラムの「第29回 データ構造(8)~コマンドライン・パラメータの切り出し」で紹介したものですが、意図的にコメントを削除してあります。ぱっと見た場合のわかりやすさを比べてみてください。

字下げに加えて適度な空白行の存在が、一定の処理の区切りを明確にするため、ソースの読みやすさが向上します。

リスト1:入力された文字列から単語を切り出して二次元配列に格納するプログラム
     ~空白行なし
#include <stdio.h>
# define _SPACE 0x20

int main(void)
{
  int i;
  char buf[1024 + 1];
  char str[4][256 + 1];
  char *s, *d;
  printf("input : ");
  (void)gets(buf);
  printf("buf = %s¥n", buf);
  s = buf;
    for (i=0; i<4; i++) {
    d = str[i];
    while ((*d++ = *s++) != _SPACE) {
    }
    *d = '¥0';
  }
  for (i=0; i<4; i++) {
    printf("str[%d] : %s¥n", i, str[i]);
  }
}

リスト2:入力された文字列から単語を切り出して二次元配列に格納するプログラム
     ~空白あり
#include <stdio.h>
# define _SPACE 0x20

int main(void)
{
  int i;
  char buf[1024 + 1];
  char str[4][256 + 1];
  char *s, *d;

  printf("input : ");
  (void)gets(buf);
  printf("buf = %s¥n", buf);

  s = buf;
  for (i=0; i<4; i++) {
    d = str[i];
    while ((*d++ = *s++) != _SPACE) {
    }
    *d = '¥0';
  }

  for (i=0; i<4; i++) {
    printf("str[%d] : %s¥n", i, str[i]);
  }
}