2016-03-10 63 views
0

我得到了一個字符串,就像讀取一行上線的文件。 C是數字之間的分隔符。C - 從字符串中提取所有數字

3000C9.5452C5.644 ... 

現在我想提取所有這些數字,並將它們寫入到一個稱爲矩陣的雙數組中。

fgets(input_string, filesize, infile); 
int matrix_size = (int) strtof(input_string, &input_end); 
++input_string; 
int binary_matrix_size = sizeof (double)*(matrix_size * matrix_size); 
double *Matrix = malloc(binary_matrix_size); 
for (int index = 0; index < (matrix_size * matrix_size); ++index) { 
     while (!isdigit(input_string) && input_string) { 
      ++input_string; 
     } 
     Matrix[index] = strtod(input_string, &input_end); 
     input_string = input_end; 
} 
+2

哪一種浮動pouint數量是'3000C9.5452C5.644' ?? – LPs

+0

您可以從ASCII表檢查數字的特定範圍(!isdigit(input_string)&& input_string)' - >應該是'while(!isdigit(*)'),這是0x30 - 0x39(1-9),如果你認識到它,只需用適當的整數替換它們。 –

+0

' input_string)&&(* input_string!='\ 0')&& input_string)'順便說一句,我真的不知道你的代碼應該做什麼... – LPs

回答

3

我試着理解你需要什麼。

#include<stdio.h> 
#include <ctype.h> 
#include <stdlib.h> 

int main() 
{ 
    char *input_string = "2C9.5452C5.644"; 
    char *input_end; 

    int matrix_size = strtol(input_string, &input_end, 10); 
    printf("Array size: %d\n", matrix_size); 
    input_string = input_end; 
    double *Matrix = malloc(sizeof(double)*(matrix_size)); 
    for (int index = 0; index < matrix_size; ++index) { 
      while ((*input_string != '\0') && !isdigit(*input_string) && input_string) { 
       ++input_string; 
      } 
      Matrix[index] = strtod(input_string, &input_end); 
      printf("Retrieved value: %f\n", Matrix[index]); 
      input_string = input_end; 
    } 

    free(Matrix); 

    return 0; 
} 

輸出是:

Array size: 2 
Retrieved value: 9.545200 
Retrieved value: 5.644000 
+0

這確實是我需要的。但輸出是「數組大小:2 檢索值:0.000000 檢索值:0.000000」 –

+0

@SvenBamberger輸出結果如已發佈....這是一個示例。你發佈了'3000C9.5452C5.644':我沒有3K值... – LPs

+0

我用你的例子。有沒有特別的編譯器選項或左右? –

1

LP的答案是正確的;然而,需要的strtod stdlib.h中(不知道爲什麼它運行在有限合夥人的

#include <stdio.h> 
#include <ctype.h> 
#include <stdlib.h> 

int main() 
{ 
    char *input_string = "2C9.5452C5.644"; 
    char *input_end; 
    int index = 0; 

    int matrix_size = strtol(input_string, &input_end, 10); 
    printf("Array size: %d\n", matrix_size); 
    ++input_string; 
    int binary_matrix_size = sizeof(double)*(matrix_size); 
    double *Matrix = malloc(binary_matrix_size); 
    for (index = 0; index < matrix_size; ++index) { 
     while ((*input_string != '\0') && !isdigit(*input_string) && input_string) { 
      ++input_string; 
     } 
     Matrix[index] = strtod(input_string, &input_end); 
     printf("Retrieved value: %f\n", Matrix[index]); 
     input_string = input_end; 
    } 
    return 0; 
} 
+0

它被添加在我用來檢查臨時代碼的文件的頂部。 Thx – LPs

+0

如果新的數字中的第一個字符是''.',while()'循環將越過它,則發佈的答案將失敗。由於輸入格式是已知的。建議用'input_string ++;'替換'while()'循環來簡單地遍歷'C'分隔符 – user3629249