C - 从字符串中提取所有数字

时间:2016-03-10 08:27:48

标签: c while-loop segmentation-fault double strtod

我通过阅读一个在线一行的文件得到了一个字符串。 C是数字之间的分隔符。

3000C9.5452C5.644 ...

现在我想提取所有这些数字并将它们写入一个名为Matrix的双数组。

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 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

LP的回答是正确的;但是,strtod需要stdlib.h(不知道为什么它在LPs上运行

ggplot(ir, aes(x = t, y = Value, colour = Variable))  +
  geom_line(size = 1) +
  geom_line(aes(x = t, y = Upper, colour = Variable), linetype = 2, size = 1) +
  geom_line(aes(x = t, y = Lower, colour = Variable), linetype = 2, size = 1) +
  scale_colour_manual(values = c("steelblue", "firebrick2", "forestgreen")) +
  scale_x_continuous(limits = c(1,20), breaks = 1:20) +
  facet_wrap(~impulse, ncol = 1) +
  xlab("Time") +
  ylab("") +
  theme(legend.title = element_blank(),
        legend.position = "bottom",
        text = element_text(face = "bold"))