0

私が取り組んでいるプログラムは、ファイルを取得して1行ずつ解析し、各行をuint32_tに変更して、配列に追加します。そこから、qsort()を使用して配列をソートすることになっています。プログラムを自分の考えどおりに作成しましたが、コードをテストすると、すべての新しいuint32_tsが同じ値であると表示されます。これは、文字列をuint32_tに変更したときの間違いによるものですか?strtoulを使用する方が良いでしょうか?最後の質問ですが、私のqsortの実装は正しいですか?(コンパイルされ、ソートされたと表示されますが、uint_32への変換が明らかに正しくないため、わかりません。とにかく、コードは次のとおりです。

int main(int argc, char* argv[]){
  char const* const fileName = argv[1];
  FILE* file = fopen(fileName, "r"); // should check the result
  char line[256];
  uint32_t parArray[256];
  int compar(const void *a, const void *b){
     const unsigned long long *x = a, *y = b;
     if(*x > *y)
       return 1;
     else
       return(*x < *y) ? -1: 0;
   }
  int lineCounter = 0; // starts at 0 for the array
  while(fgets(line, sizeof(line), file)){
     // parse all info here
     uint32_t t = (uint32_t) line;
     // build the array
     parArray[lineCounter]=t;
     lineCounter++;
     printf("Original: %s, Unsigned Int: %u\n", line,t); 
  }
  qsort(&parArray[0],lineCounter+1,sizeof(uint32_t*),compar);
  int i;
  for(i=0;i<lineCounter;i++){
    printf("%u\n",parArray[i]);
  }
  return 0;
}
4

2 に答える 2

3
uint32_t t = (uint32_t) line;

これは、Cで文字列を数値に変換する正しい方法ではありませんstrtoul。代わりに使用することをお勧めします。また、qsortも間違っています(要素の数が間違っている、要素のサイズが間違っている)。

parArray[lineCounter] = strtoul(line, NULL, 10);

/* ... */
qsort(parArray, lineCounter, sizeof(uint32_t), compar);

compar別の関数内で関数を定義しています。これはGCC拡張機能であり、移植性を計画していない限り、使用しないでください。

于 2012-02-09T19:51:03.453 に答える
1

読んでいるときに行を解析しているのではありません。単純にキャストlineするとuint32_t、メモリ内のその配列のアドレスが取得されます。これが、出力のすべての行が同じである理由を説明しています。代わりに、電話strtoul(line, NULL, 10)または同様のものを使用することをお勧めします。

また、toの2番目のパラメーターがqsort1つずれています。lineCounterループの終了時に正しい値、つまりファイル内の行数があります。1つ追加すると、配列に入力された値を超えて読み取ることにより、未定義の動作が導入されます。

于 2012-02-09T19:56:47.637 に答える