2017-12-06 26 views
0

텍스트 파일에서 두 개의 열을 추출하려고합니다. 첫 번째 열은 숫자의 실수 부분이고 허수 부분의 두 번째 열입니다. 파일에서 숫자 목록을 문자열로 추출했지만 문자열을 두 부분으로 분리하는 방법을 모르겠습니다. 나는 sscanf 함수를 사용하려고 시도했지만 hasnt는 작동했다. 어려운 부분은 숫자가 양수와 음수가 될 수 있기 때문에 음수를 제거하기 때문에 strtok 함수의 구분 기호에서 +와 -를 사용할 수 없습니다. Iv는 며칠 동안 붙어있어 어떤 제안이라도 감사 할 것입니다. 미리 감사드립니다. 다음은 sscanf 행에서 오류가 발생하는 코드입니다.
0 0
-4 100
45 -234
-56 -78 나는 그런는 실수가 발견문자열에서 복소수를 추출하려고 시도했습니다.

:

 #include <stdio.h> 
     #include <stdlib.h> 
     #include <string.h> 
     #include <complex.h> 

     char array[35]= "[[[1+1i -4+100i 45-234i -56-78i]]]"; 
     char *arrayp[35]; 
     int count,n,i,j; 
     double complex z1; 
     double real = 0; 
     double imaginary = 0; 

     int main() 
     { 
      arrayp[0] = strtok(array," []"); 
      n=1; 
      while (arrayp[n-1]!=NULL) 
      { 
       arrayp[n] = strtok(NULL, " []"); 
       n++; 
      } 
     // up to this point it has been tested to work. the remaining code is very 
     // sloppy since I have tried 8 different things and have quickly written one of 
     // the options tried.  

      for(j=0;j<n;j++) 
      { 
       if (strchr(*arrayp, '+')) 
       { 
        sscanf(arrayp[j],"%f+%fi", real, imaginary); 
       } 
       else if(arrayp string has equal to more than 1 '-') 
       { 
        sscanf(arrayp[j],"%f%fi", real, imaginary); 
       } 
      } 
     } 

출력은 다음과 같이해야한다 strchr에서 * arrayp를 검색하려하지만 포인터를 문자열로 변환하여이 파일에 넣을 수있는 방법을 모른다. 도움과 노력에 감사드립니다.

답변

2

지금까지 너무 좋아하지만

sscanf(arrayp[j],"%f%fi", real, imaginary); 

에서이 두 가지 오류가 있습니다. 먼저 scanf 기능 패밀리는 double 대상에 대해 %lf이 필요합니다.

둘째,이 주소 대상의이 필요합니다, 그래서 당신은 첫 번째 문자열 포인터의 배열을 구축해야하는 이유 또한

sscanf(arrayp[j], "%lf%lfi", &real, &imaginary); 

, 나는 보지 않는다 - 다만 모든 비 NULL 토큰을 검사 포인터는 strtok입니다.

편집 : 이것은 약간의 테스트 프로그램입니다.

#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    double r, i; 
    char array[]= "[[[1+1i -4+100i 45-234i -56-78i]]]"; 
    char *tok; 
    tok = strtok(array, " []"); 
    while(tok) { 
     sscanf(tok, "%lf%lfi", &r, &i); 
     printf("%.0f %.0fi\n", r, i); 
     tok = strtok(NULL, " []"); 
    } 
    return 0; 
} 

프로그램 출력 :

 
1 1i 
-4 100i 
45 -234i 
-56 -78i 

프로그램은 더 엄격하고 sscanf 반환 값을 확인한다.

+0

도움을 주셔서 감사 드리며 작은 실수를 수정했습니다. 나는 여전히 이상한 대답을 얻고 있습니다. 디버깅을 통해 나는이보고 있어요 : (GDB) 페이지 실제 $ 1 = 5.2635442471208903e-315 어떤 아이디어를 내가 왜이 일을보고 있지 않다? 나는 첫 번째 값을 1 + 1i로 바꿨다. 혼란을 없애기 위해 질문을 재 편집했지만, 나는 1을 얻는 대신에 이것을 얻는다. –

+0

첫 번째'strtok'은'NULL'을 반환하지 않는다고 가정했다. –

0

각 번호를 직접 파싱하십시오. "="또는 "-"중 하나를 찾고 색인 1에서 문자열을 검색하기 시작합니다 (색인 0은 +/- 또는 숫자 임). 일단 그것을 찾으면 문자열을 어떻게 분할하는지 알게됩니다.