|
> C++ を使えば簡単なんですけどね。
C で書き直してみました。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct { char **data; size_t size, capacity; } Vec;
typedef struct { char *data; size_t size, capacity; } Buf;
void error(void) { fputs("out of memory\n", stderr); exit(1); }
Vec *vec_init(void)
{
Vec *p = malloc(sizeof(Vec));
if (p == NULL) error();
p->size = 0;
p->capacity = 256;
p->data = malloc(p->capacity * sizeof(char *));
if (p->data == NULL) error();
return p;
}
Buf *buf_init(void)
{
Buf *p = malloc(sizeof(Buf));
if (p == NULL) error();
p->size = 0;
p->capacity = 256;
p->data = malloc(p->capacity);
if (p->data == NULL) error();
return p;
}
void vec_add(Vec *vp, const char *s)
{
if (vp->size == vp->capacity) {
vp->capacity *= 2;
vp->data = realloc(vp->data, vp->capacity);
if (vp->data == NULL) error();
}
vp->data[vp->size] = strdup(s);
if (vp->data[vp->size++] == NULL) error();
}
void buf_add(Buf *bp, int c)
{
if (bp->size == bp->capacity) {
bp->capacity *= 2;
bp->data = realloc(bp->data, bp->capacity);
if (bp->data == NULL) error();
}
bp->data[bp->size++] = c;
}
int getline(FILE *fp, Buf *bp)
{
int c;
bp->size = 0;
while ((c = getc(fp)) != EOF && c != '\n') buf_add(bp, c);
buf_add(bp, 0);
return bp->size > 1 || c != EOF;
}
int comp(const void *a, const void *b)
{
return strcmp(*(char **)a, *(char **)b);
}
int main(void)
{
Vec *lines = vec_init();
Buf *buf = buf_init();
size_t i;
while (getline(stdin, buf)) vec_add(lines, buf->data);
qsort(lines->data, lines->size, sizeof(char *), comp);
for (i = 0; i < lines->size; i++) puts(lines->data[i]);
/* vec_free(vec); */
/* buf_free(buf); */
return 0;
}
|