2013-10-12 2 views
0

아래 코드에서 몇 가지 문제가 발생했습니다 ...문자열을 동적으로 플로트로 변환

코드의 주요 개념은 행을 한 줄씩 읽고 부동 문자열을 부동 소수점으로 변환하고 부동 소수점을 저장하는 것입니다 배열은 nfloat입니다. N = 3

3 
[9.3,1.2,87.9] 
[1.0,1.0] 
[0.0,0.0,1.0] 

제 번호 3 우리가 볼 수있는 벡터의 수가이 경우 N = 문자열의 수 :

입력이 함유 .txt 인 이미지에서 숫자는 정적이 아니며 입력은 3 대신 5 또는 7 등이 될 수 있습니다.

지금까지 내가 (단지 1 벡터의 경우에), 다음을 수행하기 시작했지만 코드는 일부 메모리 오류가 나는 생각이 있습니다

int main(){ 
    int n; //number of string, comes in the input 
    scanf("%d\n", &n); 
    char *line = NULL; 
    size_t len = 0; 
    ssize_t read; 
    read = getline(&line,&len,stdin); //here the program assigns memory for the 1st string 
    int numsvector = NumsVector(line, read);//calculate the amount of numbers in the strng 
    float nfloat[numsvector]; 
    int i; 
    for (i = 0; i < numsvector; ++i) 
    { 
     if(numsvector == 1){ 
      sscanf(line, "[%f]", &nfloat[i]); 
     } 
     else if(numsvector == 2){ 
      if(i == 0) { 
       sscanf(line, "[%f,", &nfloat[i]); 
       printf("%f ", nfloat[i]); 
      } 
      else if(i == (numsvector-1)){ 
       sscanf((line+1), "%f]", &nfloat[i]); 
       printf("%f\n", nfloat[i]); 
      } 
     } 
    else { //Here is where I think the problems are 
     if(i == 0) { 
      sscanf(line, "[%f,", &nfloat[i]); 
      printf("%f\n", nfloat[i]); 

     } 
     else if(i == (numsvector-1)) { 
      sscanf((line+1+(4*i)), "%f]", &nfloat[i]); 
      printf("%f\n", nfloat[i]); 
     } 
     else { 
      sscanf((line+1+(4*i)), "%f,", &nfloat[i]); 
      printf("%f\n", nfloat[i]); 
     } 
    } 
} 

글쎄, 문제는 내가 생각 sscanf 지시와 함께 두 개의 부동 소수점 또는 하나가있는 문자열의 경우 코드가 제대로 작동하지만 3 개 이상의 부동 소수점의 경우 코드가 제대로 작동하지 않아 이유를 이해할 수 없습니다.

여기에서 I 너무 기능을 첨부하지만, 그것은 올바른 것 같습니다 ... 문제의 초점은 메인에 남아 있습니다.

int NumsVector(char *linea, ssize_t size){ 
     int numsvector = 1; //minimum value = 1 
     int n; 
     for(n = 2; n<= size; n++){ 
      if (linea[n] != '[' && linea[n] != ']'){ 
       if(linea[n] == 44){ 
        numsvector = numsvector + 1; 
       } 
      } 
     } 
     return numsvector; 
} 

어디에서 문제를 해결할 수 있습니까?

+1

'(line + 1 + (4 * i)) '을 (를) 계산할 수있는 것은 아무것도 없습니다. 귀하의 수레가 3 자 길이라고 가정하고 있지만, 귀하가 제공 한 데이터에서도 사실이 아닙니다. 나는 접근법이 잘못되었다고 생각합니다. 어떤 종류의 토큰 화가 필요합니다. 어쩌면 strtok을 사용할 수도 있습니다. – john

+0

네, 똑같은 생각하지만 sscanf 문만 사용할 수 있습니다 : ( – Gera

+2

코드에서 [tag : C++]과 관련된 내용을 볼 수 없습니다. 태그를 제거하거나 그 중 하나를 골라야합니다. –

답변

0

Ok - 현재 for 루프를 이것으로 바꾸면 nfloat 배열이 올바른 숫자로 끝나야합니다.

/* Replaces the end ] with a , */ 
line[strlen(line) - 1] = ','; 

/* creates a new pointer, pointing after the first [ in the original string */ 
char *p = line + 1; 
do 
{ 
    /* grabs up to the next comma as a float */ 
    sscanf(p, "%f,", &nfloat[i]); 
    /* prints the float it's just grabbed to 2 dp */ 
    printf("%.2f\n",nfloat[i]); 
    /* moves pointer forward to next comma */ 
    while (*(p++) != ','); 
} 
while (++i < numsvector); /* stops when you've got the expected number */ 
+0

굉장! 그것은 작동합니다 : D! 그러나 우리는 볼 수있는 입력 예를 들어, [9.3,1.2,87.9]와 같은 약간의 쓰레기를 출력하지만, 우리는 다음과 같은 printf를 볼 수 있습니다 : [9.300000,1.200000,87.900002] – Gera

+1

@ 제라드 일반적으로, 당신은 누군가가 stackoverflow 투표/그들의 대답을 수락하여 감사합니다 –

+0

난 부동 소수점 정밀 오류가 나타납니다 생각합니다. 2 d.p. 만 사용하는 것을 제외하고는별로 할 수 없습니다. 인쇄 할 때 데이터가 어쨌든 그렇게 보일 수 있습니다. 2 d.p.를 포함하도록 위의 답변을 업데이트했습니다. printf 문. – Baldrick