gpt4 book ai didi

C语言strtod()函数案例详解

转载 作者:qq735679552 更新时间:2022-09-27 22:32:09 25 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章C语言strtod()函数案例详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

前言

网上有很多关于strtod()函数的文章,不过大部分都是用strtod()函数转换一个字符 。

?
1
2
3
4
char *str = "111.11" ;
char *target;
double ret;
ret = strtod (str, &target);

很少有转换字符串的这样的用法 。

?
1
char *p = "111.11 -2.22 Nan nan(2) inF 0X1.BC70A3D70A3D7P+6  1.18973e+4932zzz" ;

本文主要参考strtod()函数, 只是对其中的代码示例进行解释,当然我理解示例代码时遇到了一点问题,在StackOverflow提问了以下,结果Barmar大神直接把代码解释了一遍,很佩服这位大神,StackOverflow版链接 。

代码分析

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
 
int main( void )
{
     // parsing with error handling
     const char *p = "111.11 -2.22 Nan nan(2) inF 0X1.BC70A3D70A3D7P+6  1.18973e+4932zzz" ;
     printf ( "Parsing '%s':\n" , p);
     char *end;
     for ( double f = strtod (p, &end); p != end; f = strtod (p, &end))
     {
         printf ( "'%.*s' -> " , ( int )(end-p), p);
         p = end;
         if ( errno == ERANGE){
             printf ( "range error, got " );
             errno = 0;
         }
         printf ( "%f\n" , f);
     }
 
     // parsing without error handling
     printf ( "\"  -0.0000000123junk\"  -->  %g\n" , strtod ( "  -0.0000000123junk" , NULL));
     printf ( "\"junk\"                 -->  %g\n" , strtod ( "junk" , NULL));
}

问题 1:

?
1
p = end //这条语句是干什么用的?

strtod()函数的参数:

?
1
double      strtod ( const char          *str, char          **str_end );

str   s t r 指向字符串的指针 end_str   e n d _ s t r 指向指针的指针 在未调用strtod()函数前,打印字符串指针p以及end的地址 。

?
1
2
printf ( "%p\n" , p);
printf ( "%p\n" , end);

运行结果 。

0000000000408000 000000000000002 D

接下来在执行循环时,打印p和end的地址 。

?
1
2
3
4
5
6
7
8
9
10
11
12
for (f = strtod (p, &end); p != end; f = strtod (p, &end))
      {
         printf ( "p addr = %p\n" , p);
         printf ( "end addr = %p\n" , end);
         printf ( "'%.*s' -> " , ( int )(end-p), p);
         p = end;
         if ( errno == ERANGE){
             printf ( "range error, got " );
             errno = 0;
         }
         //printf("%f\n", f);
     }

输出 。

p addr = 0000000000408000 。

end addr = 0000000000408006 。

'111.11' -> 111.110000 。

p addr = 0000000000408006 。

end addr = 000000000040800C 。

' -2.22' -> -2.220000 。

p addr = 000000000040800C 。

end addr = 0000000000408010 。

' Nan' -> 1.#QNAN0 。

p addr = 0000000000408010 。

end addr = 0000000000408017 。

' nan(2)' -> 1.#SNAN0 。

p addr = 0000000000408017 。

end addr = 000000000040801B 。

' inF' -> 1.#INF00 。

p addr = 000000000040801B 。

end addr = 0000000000408030 。

' 0X1.BC70A3D70A3D7P+6' -> 111.110000 。

p addr = 0000000000408030 。

可以发现end指针总会指向当前字符串中某一个字符的下一个字符,p指针会指向当前字符串中某一个字符 。

C语言strtod()函数案例详解

因此p = end这条语句实现了对字符串中的所有字符进行strtod()操作,而当for (f = strtod(p, &end); p != end; f = strtod(p, &end))语句中的p = end时,也即是没有字符需要进行strtod()操作了,就可以退出循环 。

问题2:

?
1
printf ( "'%.*s' -> " , ( int )(end-p), p);

打印出的为什么是一系列字符,如:

'111.11' ' -2.22' ' Nan' ' nan(2)' ' inF' ' 0X1.BC70A3D70A3D7P+6' ' 1.18973e+4932'

(int)(end - p)计算长度, %.*s中的*代表长度,也即是从当前字符串中选取多少个字符进行打印 示例代码:

?
1
2
3
4
5
6
7
8
#include<stdio.h>
 
int main ()
{
     char *p = "Hello World!" ;
     printf ( "length = 2 str = %.2s\n" , p);
     printf ( "length = 3 str = %.3s\n" , p);
}

输出 。

length = 2 str = He 。

length = 3 str = Hel 。

到此这篇关于C语言strtod()函数案例详解的文章就介绍到这了,更多相关C语言strtod()函数内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。

原文链接:https://blog.csdn.net/eye_water/article/details/80627349 。

最后此篇关于C语言strtod()函数案例详解的文章就讲到这里了,如果你想了解更多关于C语言strtod()函数案例详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com