文字列の並べ替え

標準ライブラリのqsortの使い方が少し分かったので、文字列の並べ替えもやってみた。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define NUM 10

char str[NUM][16];

void show(void) {
  int i;
  for (i = 0; i < NUM; i++) {
    printf("%s\n",str[i]);
  }
}

int cmp (const void *p1, const void *p2) {
  return strncmp((char *)p1, (char *)p2);
}

int cmplength (const void *p1, const void *p2) {
  int l1 = 0;
  int l2 = 0;
  char *c;

  c = (char *)p1;
  while (*c != 0) {
    l1++;
    c++;
  }

  c = (char *)p2;
  while (*c != 0) {
    l2++;
    c++;
  }

  return l1 - l2;
}

int main(void) {

  int i, j, length, c;

  srand(time(NULL));
  for (i = 0; i < NUM; i++) {
    length = rand() % 15 + 1;
      for (j = 0; j < length; j++) {
	c = rand() % 26 + 97;
	str[i][j] = c;
      }
      str[i][length + 1] = 0;
  }

  show();
  printf("\n-------------------- sort --------------------\n");
  qsort(str, NUM, 16, cmplength);
  show();

}

文字列の長さを数えるのは、

  c = (char *)p1;
  while (*c++ != 0) l1++;

  c = (char *)p2;
  while (*c++ != 0) l2++;

のほうが普通なんだろうか。

$ ./a.out  
cspttagcete
untkloxuiyx
gstwhwfmqu
k
lobgszc
tnsjm
umlesdzqlv
xmre
opmqxg
aompiybxunkyhq

-------------------- sort --------------------
k
xmre
tnsjm
opmqxg
lobgszc
gstwhwfmqu
umlesdzqlv
cspttagcete
untkloxuiyx
aompiybxunkyhq