2013-10-12 160 views
0

我一直有一些問題,下面這段代碼...字符串轉換爲浮動動態

代碼的主要思想是按行讀入線和轉換字符字符串轉換爲浮動並保存彩車在名爲nfloat的數組中。

的輸入是包含此一.txtÑ =串的數量,在這種情況下Ñ = 3

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

的第一個數字,3是載體的,因爲我們可以看到數在圖像中,但該數字不是靜態的,輸入可以是57等,而不是3

到目前爲止,我已經開始做了以下(僅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個或多個浮標的情況下,代碼不能很好地工作,我不明白爲什麼...

這裏我附加功能,但它似乎是正確的...問題的重點仍然是主要的。

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))'的東西。它假設你的浮動長度是三個字符,但即使在你提供的數據中也不是這樣。我認爲這種方法是錯誤的,需要某種標記化,甚至可能使用strtok。 – john

+0

是的,我認爲同樣的事情,但我只能用sscanf的:( – Gera

+2

我看不到相關[標籤:C++]任何聲明。在你的代碼中刪除標籤或選擇其中一個 –

回答

0

好 - 如果您更換當前與這個循環中,你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

@Gerard通常情況下,您可以通過投票向上/接受他們的回答 –

+0

我想你看到一個浮點精度誤差感謝有人在計算器。沒有什麼可以做的,除了只使用2個d.p.因爲無論如何,數據看起來都是這樣的。我已經更新了上面的答案,包括2個d.p. printf語句。 – Baldrick