我一直在处理这个项目,该项目处理的输入文件如下所示:
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。任何帮助都将不胜感激!
发布于 2014-11-05 19:53:07
由于第一个字符是非数字字符,所以strtod应该返回等于buffer的letters (第一个字符无效),这表明没有读取任何内容。
您应该能够通过传递&buffer[2]来修复这个问题,从该数字开始的位置:
relFreq = strtod(&buffer[2], &letters);演示。
发布于 2014-11-05 19:52:39
我不知道为什么你认为strtod会忽略你的台词中的主要字母,但它不会。你需要这样做:
relFreq = (double) strtod(&buffer[1], &letters);既然你不使用letters
relFreq = (double) strtod(&buffer[1], NULL); 发布于 2014-11-05 20:04:15
你可以用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应用于指向已找到的数字的指针,条件是缓冲区中的第一个字段总是非数字的。
https://stackoverflow.com/questions/26765795
复制相似问题