我正在为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

注意空字符串。基本上,出于某种原因,SSCANF似乎正在绊倒这些。我无法弄清楚为什么甚至彻底阅读文档。有任何想法吗?

有帮助吗?

解决方案

您的角色指针是统一的,并指向一个随机的内存段。您必须为SSCANF()分配一个缓冲区,并必须足够大。 (您幸运的是没有Segfault。)第二部分是困难的部分-Scanf()可能不是这里工作的正确工具。

其他提示

在堆栈上分配内存是简单的方法。例子:

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

顺便说一句,“在堆栈上分配内存”实际上只是意味着将堆栈指针的当前位置分配给变量名称,然后按照变量的类型大小来递增堆栈指针。与与Malloc和朋友分配内存相比,这是一个非常快的操作。与Malloc不同,但是一旦弹出当前的堆栈框架,就会丢失任何堆栈分配的内存(即执行到当前功能的末尾)。

%s 匹配非空格字符。你可能想要的是 %[^,]255 这将匹配以外的每个角色 , 代替 %s. 。 255是可选的,它指定了您期望该字段的字段宽度。

我同意塔纳托斯。首次启动时,您需要为发行和出价分配内存,您可能会这样做:

Char发行[1024]; char竞标[1024];

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top