0

スペースで区切られたトークンを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
4

2 に答える 2

0

テストを試しましたか:

#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') {
       // Just read the file
  }
}

それは無限ループだと思います。

getc()はcharではなくintを返すため、ファイルの読み取りを停止することはありません。これは無限ループです。これによりメモリが使い果たされ、最終的にセグメンテーション違反が保証されます。

char c='\0';に変更してint c;、そこからメモリ処理の改善を適用することをお勧めします。

于 2012-11-04T23:13:50.437 に答える
0

元のOPに関するVaughnCatoのコメントは、質問に対する正解でした。

「使用する必要がありますdatArr = (char**)realloc(datArr,arrSize*sizeof(char*));

ありがとうヴォーンキャット!

于 2012-11-05T00:49:50.450 に答える