문제

루비 확장 목적으로 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가 어떤 이유로 든 이들을 넘어 뜨리는 것처럼 보입니다. 왜 문서를 철저히 읽었는지 알 수 없습니다. 어떤 아이디어?

도움이 되었습니까?

해결책

캐릭터 포인터는 단위화되어 있으며 임의의 메모리 세그먼트를 가리 킵니다. SSCANF ()에 버퍼를 할당하여 쓸 수 있어야하며 충분히 커야합니다. (당신은 Segfault가 운이 좋지 않은 운이 좋다.)

다른 팁

스택에 메모리를 할당하는 것은 간단한 방법입니다. 예시:

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

그건 그렇고, "스택에 메모리 할당"은 실제로 스택 포인터의 현재 위치를 취하고 변수 이름에 할당 한 다음 변수 유형의 크기로 스택 포인터를 증가시키는 것을 의미합니다. Malloc 및 친구와 함께 힙에 메모리를 할당하는 것과 비교하여 매우 빠른 작업입니다. Malloc과 달리 현재 스택 프레임을 팝하면 스택 할당 메모리가 손실됩니다 (즉, 실행은 현재 함수의 끝에 도달합니다).

%s 비 윈 스페이스 문자와 일치합니다. 당신이 아마 원하는 것은입니다 %[^,]255 이것은 다른 캐릭터와 일치합니다 , 대신에 %s. 선택 사항 인 255는 해당 필드에 대해 기대하는 필드 너비를 지정합니다.

나는 Thanatos에 동의합니다. 첫 번째 시작으로 발행 및 입찰을 위해 메모리를 할당해야합니다.

char 발행 [1024]; 숯 입찰 [1024];

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top