在 C 中将字符串转换为 double

标签 c type-conversion dynamic-programming dynamic-memory-allocation

我即将实现一个动态矩阵结构(存储 double 值),但在读取文件时遇到了一些问题。

这个想法是,程序事先不知道行数和列数。它必须扫描第一行才能找到列数。

简单地使用 fscanf() 扫描 double 的问题是,(据我所知)它无法区分换行符和空格字符,因此它会读取整个文件作为一行。

为了解决这个问题,我首先使用函数fscanf()逐个字符地读取该行。它将值存储在一个字符串中,该字符串恰好代表一行。

然后我使用 sscanf() 扫描字符串中的 double 值并将它们存储在 double 组中。转换后我释放了字符串。这是在 chararray_to_doublearray 函数中完成的。

现在,经过一些测试,我怀疑 chararray_to_doublearray 函数未按预期工作。

/* Converts a character array to a double array and returns a pointer to it. Frees the space of the character array, as it's no longer needed. */
double *chararray_to_doublearray(char **chararray)
{
    int i;
    int elements = 0;
    double *numbers=NULL;
    double newnumber;
    while (sscanf(*chararray, "%lf ", &newnumber) == 1) {
        double* newarray = (double*) malloc(sizeof(double) * (elements+1));
        for (i = 0; i < elements; ++i)
            newarray[i] = numbers[i];
        free(numbers);
        numbers = newarray;
        numbers[elements] = newnumber;
        ++elements;
    }
    free(*chararray);
    return numbers;
}

并且 main() 函数仅调用 chararray_to_doublearray 函数:

main ()
{
    int i;
    double *numbers;
    char string[50]="12.3 1.2 3.4 4 0.3";
    numbers=chararray_to_doublearray(&string);
    free(numbers)
    return 0;
}

总结一下:我找不到任何从用户(或文件)读取双值直到行尾的良好实现。这是我的实现。 您有什么想法吗?这可能有什么问题?

问候,

naroslife

最佳答案

这是一个XY problem 。您真的需要“fscanf()逐个字符地执行该行”吗?这是否导致您向错误的方向提出了太多问题?

考虑一下:%lf 表示将字符转换为您选择的 double...当没有更多合适的字符可供转换时,它会立即停止。 .并且换行符不是一个合适的转换字符...您的脑海中是否有一个灯泡在闪烁?

在您的情况下,格式字符串中 %lf 后面的空格会导致有用信息(无论空格是否为换行符)被丢弃。停止!你已经走得太远了,结果是你现在需要一个中间字符数组转换函数,这是不必要的膨胀。

有了这个新发现,从格式字符串中删除空格将导致后固定换行符留在流中,请考虑使用 fgetc 来处理常规白色之间的区别- 空格和换行符。

例如

double f;
int x = scanf("%lf", &f);
int c;
do {
    c = getchar();
} while (isspace(c) && c != '\n');
if (c != '\n') {
    ungetc(c, stdin);
}

参见上文,我如何区分换行符和非换行符空格?

关于在 C 中将字符串转换为 double ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34012497/

相关文章:

python - 在 Travis CI 上卡住 Python 应用程序

在没有sprintf的情况下在C中将整数转换为字符串

algorithm - 确定最长的连续子序列

c - 为什么这不打印到标准输出 (stdout)?

c++ - 将 C++ 复杂数组传递给 C

c++ - 最快的数组结构到结构数组的转换

c++ - 指针可以在函数调用期间转换为数组吗?

java - 在这种情况下,动态规划与内存的复杂性?

algorithm - 丑陋的数字——DP 方法

c - 需要编写一个程序,该程序采用汇编语言程序并生成相应的机器语言