Sortingのための準備(C言語編)

まずはC言語で.標準入力から可変個のデータを読み込む関数と,それを出力する関数を作ってみた.mylib.cとして保存しておく.

#include "mylib.h"
/** 
 * @brief 配列にデータを標準入力から読み込む
 * 
 * @param size 配列の大きさ
 * 
 * @return 配列
 */
int *load_array(int *size){
char line[BUFSIZ];
char *token;
char *str;
int allocated=1;
int *array=(int *)calloc(allocated,sizeof(int));
*size=0;
// EOFがくるまで繰り返し
while(fgets(line,BUFSIZ,stdin)!=NULL){
// 入力された文字列をトークンに分割
for(str=line;(token=strtok(str," \n"))!=NULL;str=NULL){
// メモリが足りなければ追加
if(*size >= allocated){
allocated*=2;
array=(int *)realloc(array,allocated*sizeof(int));
}
// 文字列を数値に変換して配列へ格納
array[*size]=atoi(token);
(*size)++;
}
}
// 配列の長さを調整
array=(int *)realloc(array,(*size)*sizeof(int));
return array;
}
/** 
 * @brief 配列の内容を1行につき10個ずつ表示する
 * 
 * @param array 配列
 * @param size 配列の大きさ
 */
void print_array(int *array,int size){
int i;
for(i=0;i<size;i++){
printf("%8d",array[i]);
if(i%10==9)printf("\n");
}
}

メモリ確保を賢くやってみました.確保しすぎた分を最後に微調整してぴったりにしています.

mylib.hはプロトタイプ宣言とヘッダのインクルード.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int *load_array(int *size);
void print_array(int *array,int size);

とりあえず,使い方の例は,

#include "mylib.h"
int main(){
int *array;
int size;
//入力
array=load_array(&size);
//ここでソート
//bubblesort(array,size);
//
//出力
print_array(array,size);
free(array);
return 0;
}

こんなプログラム(test.c)を作って,一緒にコンパイルする.

Linuxなら

$ gcc -o test test.c mylib.c
$ ./test.c < data.txt

data.txtは,データが各行,適当な個数ごとにスペース区切りで書かれているものとする.

64 70 12
34 35
74 24 81
86 89
54 76 66 92 41 93 95 97 3 49 56
73 78 90 96 98
69
57 44 36 9 20 55
31 53 79 94
99 11
87 5 15
59 17 46 52 62
75 77 38 27 88
23
91 32 19 16 8 25 30 58 72 43 42 29 48 50 60 71
40 65 47
10 13 80 82
83
14
51 2 84 39 45 0
68
85 61 1
26
21 18 22 6 33
37
28 63 4 67
7

さて,ソーティング部分を作るか・・・.

コメントする