スペースで区切られたトークンをstdinから取り込み、トークンをシャッフル(並べ替え)してから、シャッフルトークンをstdoutに出力する短いプログラムをCで作成しようとしました。私のシャッフルアルゴリズムは正常に機能します。問題はトークンの解析にあります。プログラムがstdinを介して渡されるトークンをいくつでもサポートできるように、トークンを動的文字列配列に格納したかったのです。ただし、動的配列の現在の実装では、配列を拡張する必要がある場合は常にセグメンテーション違反が発生します。私は間違って何をしていますか?
私のコード:
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFFERSIZE 33
int main(int argc, char* argv[]) {
int i,j,k;
i=j=k=0;
int arrSize = 10;
/* Temp fix */
/* Get token count as command line argument */
//if (argc==2) { sscanf(argv[1],"%d",&arrSize); }
char c='\0';
char* t;
char** datArr = (char**)malloc(sizeof(char*)*arrSize);
//char* datArr[arrSize];
char token[BUFFERSIZE];
while ( (c=getc(stdin)) != EOF && c != '\0') {
if(isspace(c)) {
token[i] = '\0';
i=0;
if ( j >= arrSize) {
arrSize *= 2;
realloc(datArr, arrSize);
}
char* s = (char*)malloc(sizeof(char[BUFFERSIZE]));
strcpy(s,token);
datArr[j++] = s;
}
else if(i+1 < BUFFERSIZE) {
token[i++] = c;
}
}
/* Permutate & Print */
srand(time(NULL));
for(i=0;i<j;++i) {
k = rand()%(j-i);
t = datArr[k];
datArr[k] = datArr[j-i-1];
datArr[j-i-1] = t;
}
for(i=0;i<j;++i) { printf("%s ",datArr[i]); }
printf("\n");
return 0;
}
注:私はまだメモリを解放したことを知っています
いくつかのサンプル入力(カードをテーマにしたものにするため):
2C 3C 4C 5C 6C 7C 8C 9C 10C JC KC QC AC 2S 3S 4S 5S 6S 7S 8S 9S 10S JS KS QS AS