Chinaunix

标题: 请教sscanf的问题 [打印本页]

作者: sunceenjoy    时间: 2008-09-26 18:08
标题: 请教sscanf的问题
#include <sys/time.h>
#include <stdio.h>
#include <unistd.h>
int main(){
    double db;
    float    ft;
    struct timeval tv;
    char tt[30];
    gettimeofday(&tv,NULL);

    int len = sprintf(tt,"%ld.%ld",tv.tv_sec,tv.tv_usec);
    tt[len] = '\0';

    sscanf(tt,"%f",&db);
    sscanf(tt,"%f",&ft);
    printf("tt:\t%s\n db:\t%f\n ft:\t%f",tt,db,ft);

    return 0;
}

我的执行结果:
tt:     1222423527.378962
db:     0.000000
ft:     1222423552.000000

请问这是怎么回事?怎么附值不上了??
作者: Godbach    时间: 2008-09-26 18:40
sscanf(tt,"%ld.%ld",&db, &ft);
试试
作者: Godbach    时间: 2008-09-26 18:42
没看清楚题意。惭愧。
给%f加上有效位数和小数点后几位,试试譬如%10.5f

[ 本帖最后由 Godbach 于 2008-9-26 18:45 编辑 ]
作者: nicozhou    时间: 2008-09-26 19:07
原帖由 Godbach 于 2008-9-26 18:42 发表
没看清楚题意。惭愧。
给%f加上有效位数和小数点后几位,试试譬如%10.5f



小数点后保留5位
作者: sunceenjoy    时间: 2008-09-27 09:04
换成%10.5还是不行,请问还有其他方法吗?
作者: Godbach    时间: 2008-09-27 09:12
得了,偶也测试一下吧。说不如做
作者: Godbach    时间: 2008-09-27 09:20
可以直接atof,哈哈,这是个变通的方法。
作者: sunceenjoy    时间: 2008-09-27 09:25
怎么我这里就是不行啊.
tt:     1222478666.380682
db:        0.00000
ft:        0.00000
atof:   0.000000

Linux test1.yellzone.com 2.4.21-40.ELsmp #1 SMP Thu Feb 2 22:22:39 EST 2006 i686 i686 i386 GNU/Linux
作者: Godbach    时间: 2008-09-27 09:28
原帖由 sunceenjoy 于 2008-9-27 09:25 发表
怎么我这里就是不行啊.
tt:     1222478666.380682
db:        0.00000
ft:        0.00000
atof:   0.000000

Linux test1.yellzone.com 2.4.21-40.ELsmp #1 SMP Thu Feb 2 22:22:39 EST 2006 i686 i686 ...


刚才试了一下,ft可以出来值。但是感觉
tt:     1222289739.926623
db:    0.000000
ft:    1222289792.000000
感觉可能是float默认总的长度有限,肯定低于你这里sec和usec的长度,所以只能显示部分。
作者: sunceenjoy    时间: 2008-09-27 09:28
其实我是想实现一段程序执行的时间。
有人用
    clock_t start, finish;
    double   duration;
    start = clock();
/**待测程序段*/
   
    finish = clock();
duration = (double)(finish - start)/ CLOCKS_PER_SEC;
printf("\n%f",duration);

这样是可以的。

   但我想我那样来计算时间差应该也是可以的,但就是不能转成double!
作者: Godbach    时间: 2008-09-27 09:31
原帖由 sunceenjoy 于 2008-9-27 09:28 发表
其实我是想实现一段程序执行的时间。
有人用
    clock_t start, finish;
    double   duration;
    start = clock();
/**待测程序段*/
   
    finish = clock();
duration = (double)(finish - st ...


那你手动的去处理好了。
作者: sunceenjoy    时间: 2008-09-27 09:31
原帖由 Godbach 于 2008-9-27 09:28 发表


刚才试了一下,ft可以出来值。但是感觉
tt:     1222289739.926623
db:    0.000000
ft:    1222289792.000000
感觉可能是float默认总的长度有限,肯定低于你这里sec和usec的长度,所以只能显示部分。

我也是这样的结果。但是加上%10.5f这样的话,反而都是0.000了,不管怎么说double应该不低于啊.但也不行,atof呢?

是不是只能这样,要司空见惯的话,也就算了。
作者: Godbach    时间: 2008-09-27 09:40
db=atof(tt), 我这里没有问题

tt:     1222290522.653195
db:    1222290522.653195
ft:    1222290560.000000
作者: ynchnluiti    时间: 2008-09-27 13:24
原帖由 sunceenjoy 于 2008-9-26 18:08 发表
    ...
    double db;
    double ft; //
    ...

    sscanf(tt,"%lf",&db);
    sscanf(tt,"%lf",&ft);

使用 %lf,  指针指向double类型
作者: yuanchengjun    时间: 2008-09-27 14:25
%lf 试试




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2