C で split をどう書くかという、昭和時代の自転車置き場の議論

でまあというわけで split/join とかしたい時は 99% 速度なんて気にしてないという法則から、普通に vector かえす split がとりあえずあったりいいんじゃないかなぁとか思うわけです。

split/join - はじめてのにき(2009-03-17)

C++ の場合であれば 100% 同意です。ただ、good old な C 言語の場合はどうするのがいいのかな、と思ったのでした。メモリ確保したりしたら、解放めんどくさいし。で、自分だったら、

size_t split_str(char *s, int split_char, char **list, size_t max_count)
{
  size_t count = 0;
  
  if (count < max_count)
    list[count] = s;
  count++;
  
  for (; *s != '\0'; s++) {
    if (*s == split_char) {
      *s = '\0';
      if (count < max_count)
        list[count] = s + 1;
      count++;
    }
  }
  
  return count;
}

...

  #define MAX_COLS 100
  char *cols[MAX_COLS];
  size_t ncols = split_str(buf, ',', cols, MAX_COLS);
  if (ncols > MAX_COLS)
    return -1;
  for (i = 0; i < ncols; i++)
    ...

みたく書くのかなぁ、と。パースするデータはほとんどの場合、fgets とかで読んでる=破壊可能だろうから、これでヒープ不要じゃん、みたいな。

こういうどうでもいいことが気になるなんて、C はなんて素敵な言語なんだ、と思います (自転車置き場的な意味で) 。全然役にたたない話ですね。すみません。