sscanf
对输入非常挑剔。strtod
使用or会有更好的运气strtol
- 他们可以读取一个值,即使它后面是垃圾。更改您的代码如下:
#define LUNRIGA 200
char riga[LUNRIGA+1];
char* tempPtr;
while (fgets(riga,LUNRIGA,f) != NULL) {
numeri[i] = strtof( riga, &tempPtr );
if (tempPtr > riga) { /* riga valida */
printf("OK");
}
else {
printf("Error");
return 1;
}
}
请注意,您似乎没有i
在循环中增加 - 您可能想看看这是否真的是您想要的,或者您是否想在每次获得有效数字时增加它(假设您不只是想要最后一个值,但所有这些值......)
作为 的行为的一个小演示strtod
,我写了几行代码:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
char* s1="123.45t";
char* p1;
char* s2 = " notanumber";
double d1, d2;
d1 = strtod(s1, &p1);
printf("the number is %.2lf; the pointer is now %p; string is at %p\n", d1, s1, p1);
d2 = strtod(s2, &p1);
printf("the number is %.2lf; the pointer is now %p; string is at %p\n", d2, s2, p1);
}
这个的输出是:
The number is 123.45; the pointer is now 0x400668; string is at 0x40066e
The number is 0.00; the pointer is now 0x400670; string is at 0x400670
如您所见,在读取垃圾时,返回的指针指向字符串的开头 - 表示“失败”。成功时,指针指向“我停止阅读的地方”,即“在成功将一个字符串转换为双精度之后。