【问题标题】:C - extracting all Numbers from stringC - 从字符串中提取所有数字
【发布时间】:2016-06-24 23:35:19
【问题描述】:

我通过读取一个在线的文件得到了一个字符串。 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;
}

【问题讨论】:

  • 3000C9.5452C5.644..?? 是哪种浮点数?
  • 您可以从 ASCII 表中检查特定范围的数字,即 0x30 - 0x39 (1-9),如果您认出它,只需将它们替换为适当的整数。
  • while (!isdigit(input_string) &amp;&amp; input_string) --> 应该是while (!isdigit(*input_string) &amp;&amp; (*input_string != '\0') &amp;&amp; input_string ) BTW 我真的不知道你的代码应该做什么......
  • 不清楚,因为:为什么要使用strtof来提取数组大小?如果需要数组,为什么要分配矩阵?您的 for 必须迭代 matrix_size 次。正如我之前发布的那样,while 必须更改.....
  • 如果C是分隔符,代码应该寻找C

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


【解决方案1】:

我试图了解您的需求。

#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

【讨论】:

  • 这确实是我需要的。但输出是“数组大小:2 检索值:0.000000 检索值:0.000000”
  • @SvenBamberger 输出如发布......这是一个例子。你发了3000C9.5452C5.644:我没有3K值....
  • 我用了你的例子。有没有什么特殊的编译器选项?
  • @SvenBamberger 我编译时使用:gcc -Wall -Wextra -pedantic test.c -o test -std=c99
  • 我根据您的选择进行了编译。仍然得到Array size: 2 Retrieved value: 0.000000 Retrieved value: 0.000000
【解决方案2】:

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

#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;
}

【讨论】:

  • 它被添加到我用来检查临时代码的文件顶部。谢谢
  • 如果新号码中的第一个字符是 a.,则发布的答案将失败,因为 while() 循环将跳过它。由于输入格式是已知的。建议将while() 循环替换为:input_string++; 以简单地跨过C 分隔符
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-29
  • 1970-01-01
相关资源
最近更新 更多