|
わかりやすい解説ありがとうございます。
さきほどのコードに自分なりにコメントをつけてみました。
追加、訂正するべきところなどありましたら、
どんどんご指摘のほうよろしくおねがいします。
それと「コピー」と「複製」の違いとはなんでしょうか?
#include <stdio.h>
#include <stdlib.h> /* qsort()を使うのに必要 */
#include <string.h> /* strcmp()を使うのに必要 */
#define MAXLINES 256 /* 最大行 */
#define MAXLENS 256 /* 最大文字列長 */
int cmp(const void *s1, const void *s2) /* qsort()で使う */
{
return strcmp(*(const char **)s1, *(const char **)s2); /* s1とs2の比較 */
}
char *strdup(const char *s)
{
char *p;
p = malloc(strlen(s) + 1); /* 文字列終端子の分、一つ多く領域確保 */
if (p != NULL) strcpy(p, s); /* メモリ確保に成功した場合、文字列をコピーする */
return p;
}
int main(void)
{
char *str[MAXLINES]; /* 文字列を記憶するための配列 */
char instr[MAXLENS]; /* 文字列を「一時的に」記憶するための配列 */
int i = 0, j;
while (fgets(instr, MAXLENS, stdin)) { /* 標準入力( stdin )から instr に一行読み込み、ファイルの終わりまでかエラーが発生した場合はループを終了させる */
str[i] = strdup(instr); /* str[i]にinstrを複製 */
str[i][strlen(str[i]) - 1] = '\0'; /* 文字列の最後にある'\n'を'\0'に置換 */
i++; /* iを進め、行を格納するstr[i]を進める */
}
qsort((void *)str, i, sizeof(char *), cmp); /* ソート */
for (j = 0; j < i; j++) {
puts(str[j]); /* 今までstrに格納し、ソートされたものを出力 */
free(str[j]); /* strdup()で確保した文字列の領域の開放 */
}
return 0;
}
|