文字列の並べ替え
標準ライブラリの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