0

Ruby拡張の目的でCでいくつかのCSVデータを解析しています。各行からデータを引き出すために、次のようにsscanfを使用しています。

  char* line = RSTRING_PTR(arg);
  double price;
  double volume_remaining;
  unsigned int type_id, range, order_id, volume_entered, minimum_volume, duration, station_id, region_id, solar_system_id, jumps;
  char* issued;
  char* bid;
  printf("I got %s\n",line);
  int res = sscanf(line, "%lf,%lf,%u,%u,%u,%u,%u,%s,%s,%u,%u,%u,%u,%u", &price, &volume_remaining, &type_id, &range, &order_id, &volume_entered, &minimum_volume, bid, issued, &duration, &station_id, &region_id, &solar_system_id, &jumps);
  printf("I matched %d values\n", res);
  printf("I have price %f, vol_rem %f, type_id %d, range %d, order_id %d, vol_ent %d, min_vol %d, issued %s, bid %s, duration %d, station_id %d, region_id %d, solar_system_id %d, jumps %d, source %s \n",price, volume_remaining, type_id, range, order_id, volume_entered, minimum_volume, issued, bid, duration, station_id, region_id, solar_system_id, jumps, source); // and hash build follows below

これを実行すると、次のようになります。

I got 728499.93,437.0,2032,32767,1132932560,588,1,False,2009-05-24 19:52:08.000,90,60003760,10000002,30000142,0
I matched 7 values
I have price 728499.930000, vol_rem 437.000000, type_id 2032, range 32767, order_id 1132932560, vol_ent 588, min_vol 1, issued (null), bid (null), duration -1210229476, station_id 3001, region_id 3001, solar_system_id 1, jumps -1210299816

null文字列に注意してください。基本的に、sscanfが何らかの理由でこれらにつまずいているようです。ドキュメントをよく読んでも理由がわかりません。何か案は?

4

4 に答える 4

2

文字ポインタは単一化されており、メモリのランダムなセグメントを指しています。sscanf()に書き込むためのバッファを割り当てる必要があり、十分な大きさである必要があります。(セグメンテーション違反がなかったのは幸運です。)その2番目の部分は難しい部分です。scanf()はここでの作業に適したツールではない可能性があります。

于 2009-07-01T00:23:42.873 に答える
2

スタックにメモリを割り当てるのは簡単な方法です。例:

char issued[1024] = {0};
char bid[1024] = {0};

ちなみに、「スタックにメモリを割り当てる」とは、実際には、スタックポインタの現在の位置を取得し、それを変数名に割り当ててから、変数の型のサイズだけスタックポインタをインクリメントすることを意味します。これは、mallocや友人とヒープにメモリを割り当てるのに比べて非常に高速な操作です。ただし、mallocとは異なり、現在のスタックフレームをポップすると(つまり、実行が現在の関数の最後に到達すると)、スタックに割り当てられたメモリが失われます。

于 2013-01-10T13:53:55.673 に答える
1

%s空白以外の文字に一致します。おそらく必要なのは、の代わりに%[^,]255以外のすべての文字に一致するものです。オプションの255は、そのフィールドに期待するフィールド幅を指定します。,%s

于 2009-07-01T00:39:33.013 に答える
0

タナトスに同意します。最初のスタートとして、発行と入札にメモリを割り当てる必要があります。次のようにします。

char発行[1024]; char bid [1024];

于 2009-07-01T00:39:37.613 に答える