我编写了一个代码,它从.dat文件读取一个方形矩阵,从一个单独的.dat文件中读取一个矢量,然后对这两个文件进行扩充,并进行高斯消除,使增强矩阵成为行减少梯形。我现在正努力使其用户友好,并在用户输入无意义时优雅地崩溃。例如,我检查确保矩阵是方形的,并且矢量的长度与矩阵的维度相匹配。我现在要做的是检查数据文件中是否有任何不是数字的字符或符号。
我的尝试:像scanf("%lf", )
这样的东西会起作用,当它遇到其中一个符号时会停止。问题是我的输入不是来自命令行。 (命令行在这里不是一个选项,因为我希望代码能够接受用户不想坐在那里并在命令行中输入的巨大矩阵)。当fscanf("%f", )
遇到字符串时,它会变得疯狂。
是否有类似scanf的东西会停止但在遇到信件时不会发疯?
如果没有,还有其他建议吗?
答案 0 :(得分:1)
使用fgets
将行放入预先分配的缓冲区,然后使用strtoX
提取浮点数。 (X
f
= float
,X
d
= double
,X
= ld
{ {1}}。
其签名为long double
,其中X_t strtoX(const char *nptr, char **endptr)
是对应的类型(X_t
,float
或double
)。
在到达行尾(long double
)之前,递增行指针(设置为指向预分配缓冲区,如果它在**endptr = '\n'
之后没有递增,则递增它直到确实如此。
使用两个变量,如:
strtoX
我的代码不是很好,但它应该表明这一点。
此外,{C} / POSIX 2011之前不支持char *lp = buf;
char *lp2 = buf;
do {
X_t x = strtoX(lp, &lp2);
if (lp == lp2 && *lp != '\n') {
++lp;
continue;
}
if (*lp2 == '\n')
goto read_line;
// do something with x
} while (1);
= strtoX
和X
= f
的{{1}}。