2016-09-07 5 views
0

strsep()로 쉼표로 구분 된 값 파일을 구문 분석 할 때 원치 않는 결과가 표시됩니다. 그것은 하나의 값 (즉, 0-9)을 가진 숫자로 파일의 절반을 위해 작동하지만, 512와 같이 여러 값이 추가되는 즉시strsep로 분할하여 CSV 파일 구문 분석

512 12 2 512를 인쇄합니다. 12 2 등. 이것이 루핑하는 특정 스타일 때문인지 확실하지 않습니다. 별로 모르겠다.

int main() { 

     char line[1024]; 

     FILE *fp; 

     int data[10][10]; 

     int i = 0; 
     int j = 0; 

     fp = fopen("file.csv", "r"); 

     while(fgets(line, 1024, fp)) { 

       char* tmp = strdup(line); 
       char* token; 
       char* idx; 

       while((token = strsep(&tmp, ","))) { 

         for (idx=token; *idx; idx++) { 
           data[i][j] = atoi(idx); 
           j++; 
         } 
       } 
       i++; 
       j=0; 

       free(tmp); 

     } 


     for(i = 0; i < 10; i++) { 

       for(j = 0; j < 10; j++) { 
       printf("%d ", data[i][j]); 
       } 
       printf("\n"); 
     } 

     fclose(fp); 
} 
+1

디버거에서 코드를 단계별로 실행하면 아마도 매우 계몽 적이었을 것입니다. 디버거 사용법을 배우고 간단한 문제가 매우 빨리 해결 될 수 있습니다. –

답변

3

당신이 그 일을하고 해결하는 하나의 토큰에서 하나 개의 요소를 생성 루프

for (idx=token; *idx; idx++) { 
     data[i][j] = atoi(idx); 
     j++; 
} 

정지를 통해 시작으로 strsep()에 의해 반환 된 토큰의 모든 문자를 사용하여 요소를 만드는 때문입니다 : tmpstrsep()에 의해 NULL로 설정되기 때문에

while((token = strsep(&tmp, ","))) { 

     data[i][j] = atoi(token); 
     j++; 
} 

또한 free(tmp);는 처리를하지 않습니다. strdup()을 통해 할당 된 버퍼를 해제하려면 포인터를 다른 변수에 보관하고 해제 할 때 사용하십시오.