我一直在处理这个项目,该项目处理的输入文件如下所示:
A 0.0345
B 0.3945
...
Z 0.2055
基本上,我在读完每一行后,我想把仅拉出字符串的双倍。我尝试使用strtod()
并且每个人的例子似乎都很好地使用它,但在我的例子中,它只返回0.
这是我的代码:
for (count = 0; count < 26; count++)
{
char buffer[100]; /* Buffer for the line read by fgets */
char *letters; /* Stores the string calculated by strtod */
double relFreq = 0.0;
if (fgets(buffer, 100, stream) != NULL)
{
relFreq = (double)strtod(buffer, &letters); /* Since the format is A 0.0000, we're just grabbing the double */
*(sampleOne + count) = relFreq; /* Add the relFreq to the array */
}
}
通过使用调试器,buffer
具有正确的数据,例如A 0.0345\n
,但当strtod()
返回值时,它始终为0.任何帮助将不胜感激!
答案 0 :(得分:2)
由于第一个字符是非数字字符,strtod
应该返回letters
等于buffer
(第一个字符无效),表示没有读取任何内容。
您应该可以通过传递号码开始的&buffer[2]
来解决此问题:
relFreq = strtod(&buffer[2], &letters);
答案 1 :(得分:1)
我不确定为什么你认为strtod
会忽略你们行上的主要信件,但事实并非如此。你需要做这样的事情:
relFreq = (double) strtod(&buffer[1], &letters);
因为你没有使用letters
:
relFreq = (double) strtod(&buffer[1], NULL);
答案 2 :(得分:1)
您可以使用sscanf
。例如
#include <stdio.h>
int main(void)
{
char *s = "A 0.0345\n";
char c;
double d;
sscanf( s, "%c %lf", &c, &d );
printf( "%f\n", d );
return 0;
}
输出os
0.034500
至于你的代码,那么你首先可以在缓冲区中找到一个数字并将函数strtod应用于指向找到的数字的指针,前提是缓冲区中的第一个字段始终是非数字。