所以我认为这应该是非常直接的。实际上,我甚至无法理解什么可能会出错,这也是最让我困扰的地方。
事情是这样的:我必须从一个文件中读取几个数字,但这些数字是用科学符号表示的。示例文件中的数字如下所示:
1.00090E+00,2.90000E+00所以我想我只需要这样读:获得一个双,忽略一个字符,得到一个int,忽略一个字符,得到另一个双,忽略一个字符,得到一个最后的int,所以对于这个例子,它会:
get (1.00090)
ignore (E)
get (+00)
ignore (,)
get (2.90000)
ignore (E)
get (+00)所以,我写了这些fscanf:
fscanf(arquivo, " %lf%*c%d%*c", &mantissa1, &expoente1);
x[i] = numToFloat(mantissa1, expoente1);
fscanf(arquivo, "%lf%*c%d", &mantissa2, &expoente2);
fx[i] = numToFloat(mantissa2, expoente2);我把他们分开让理解更简单。但那样的话,就不管用了。它正确地读取了第一个双变量,但随后却把int弄乱了。然后它就把第二次扫描上的一切都搞砸了。我试过我能想到的一切。将格式化的字符串放到fscanf ("%lfE%d,"和"%lfE%d")上。将信号读入字符变量("%lf%*c%c%d%*c")。都不管用。
有什么不对的猜测吗?
发布于 2016-10-30 17:05:53
首先,不需要分别解析尾数和指数。scanf本机理解n.nnnE±nnn表示法。这就是为什么您的格式字符串不像预期的那样运行的原因;%lf指令消耗包括E+00段在内的整个第一个数字,然后%*c使用逗号,%d %d 2,现在我们完全失去了同步。
第二, functions, ever。相反,一次用fgets (或者getline,如果有)读一行,用strtok在逗号上拆分它,用strtod将数字转换成二进制(这也可以理解科学的符号)。这将是更多的预先编码,但结果将更容易阅读和调试,它将更容易使其对格式错误的输入健壮,它将有良好的行为,在输入溢出。
(从技术上讲,您不需要使用strtok,因为strtod会告诉您每个数字的结束位置,但从概念上来说,先进行拆分比较简单。)
发布于 2016-10-30 17:06:01
您可能可以根据您的需要修改此示例,它使用了%lg格式说明符:
#include <stdio.h>
int main(void){
double d, e;
int n;
printf("Enter 2 scientific floats: ");
fflush(stdout);
n = scanf("%lg %*c %lg", &d, &e);
if(n == 2) {
printf("%f\n", d);
printf("%f\n", e);
} else {
printf("Bad input\n");
}
}程序会话
Enter 2 scientific floats: 1.8e+4,4.2e-1
18000.000000
0.420000https://stackoverflow.com/questions/40331406
复制相似问题