c语言strtod()函数详解

article/2025/3/10 20:34:16

前言

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

char *str = "111.11";
char *target;
double ret;
ret = strtod(str, &target);

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

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

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

代码分析

#include <stdio.h>
#include <errno.h>
#include <stdlib.h>int main(void)
{// parsing with error handlingconst 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 handlingprintf("\"  -0.0000000123junk\"  -->  %g\n", strtod("  -0.0000000123junk", NULL));printf("\"junk\"                 -->  %g\n", strtod("junk", NULL));
}

问题 1:

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

strtod()函数的参数:

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

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

printf("%p\n", p);
printf("%p\n", end); 

运行结果

0000000000408000
000000000000002D

接下来在执行循环时,打印pend的地址

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 addr = 000000000040803F

可以发现end指针总会指向当前字符串中某一个字符的下一个字符,p指针会指向当前字符串中某一个字符
这里写图片描述
因此p = end这条语句实现了对字符串中的所有字符进行strtod()操作,而当for (f = strtod(p, &end); p != end; f = strtod(p, &end))语句中的p = end时,也即是没有字符需要进行strtod()操作了,就可以退出循环

问题2:

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

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

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

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

#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

http://chatgpt.dhexx.cn/article/Mk5YhcwR.shtml

相关文章

mysql 手机号省份_手机号码怎么划分省份

展开全部 我们知道中国的手机号码一般是有十一位&#xff0c;依照一定的顺序排32313133353236313431303231363533e59b9ee7ad9431333431353939列&#xff0c;那么当我们看到一个手机号时如何根据手机号码看出是哪个城市的号码呢&#xff1f; 一般中国大陆地区的号码格式是13*###…

【python正则表达式匹配获取文本中的11位手机号码】

【python正则表达式匹配获取文本中的11位手机号码】 文前白话代码实现效果正则知识补充 文前白话 根据需要,匹配一段没有固定格式的文本,识别其中的11位数字作为手机号,如果11位数字后还有数字&#xff0c;则不认为该11位数字是手机号,从文本中匹配出正确的手机号 如文件: info…

拿走不谢,最全匹配中国大陆手机号码的正则表达式

匹配所有号码&#xff08;手机卡 数据卡 上网卡&#xff09; ^(?:?86)?1(?:3d{3}|5[^4D]d{2}|8d{3}|7(?:[01356789]d{2}|4(?:0d|1[0-2]|9d))|9[189]d{2}|6[567]d{2}|4(?:[14]0d{3}|[68]d{4}|[579]d{2}))d{6}$ 匹配所有支持短信功能的号码&#xff08;手机卡 上网卡…

FPGA学习教程-黑金AX301B

本文简洁介绍AX301B的主要资料和示例代码&#xff08;会继续更新&#xff09; 芯片类型&#xff1a;EP4CE6F17C8 封装&#xff1a;FBGA 引脚数&#xff1a;256 核心速度等级&#xff1a;8 芯片资源&#xff1a;6272 引脚列表 示例代码链接: 示例代码_001_led.

FPGA 黑金XC6SLX9 08.spi_flash源码分析 spi flash数据的读取擦除写入实验(1)

Spi flash 数码管显示flash两位数 按键可实现数据写入 流程图 // // // // // // Author: meisq …

FPGA最简单的按键消抖(AX301)

就是20ms扫描2个状态&#xff0c;通过2个状态进行判断 module key_test( input wire key_a, input wire clk, input wire rst_n, output reg led ); reg [19:0]cnt; reg key_tma; always(posedge clk or negedge rst_n) if(rst_n1b0) cnt<20d0; else if(cnt20d999_999) beg…

基于FPGA的IIC协议详解——EEPROM控制器(1)

IIC协议举例 常用IIC协议使用地方常见IIC协议的注意点24LC64芯片读写命令的时序图eeprom控制器的系统框图时序图设计代码设计EEPROM控制器测试模块的代码结束语 常用IIC协议使用地方 熟悉一个协议一定要知道这个协议应该用到什么地方&#xff0c;IIC协议作为飞利浦公司定义的一…

FPGA连接电脑找不到UART串口

打开设备管理器看看是哪个芯片 百度搜索其官网 我的是CP2102N 网址是https://www.silabs.com/developers/usb-to-uart-bridge-vcp-drivers 安装驱动后即可

FPGA实现千兆以太网发送

科研要求&#xff0c;使用手上的DE2-115开发板实现千兆以太网的数据发送 千兆以太网使用的时钟频率为125MHz&#xff0c;一般的GMII接口由于收发数据所使用的数据线为8根即一个时钟周期的上升沿可以发送8bit数据&#xff0c;而DE2-115开发板所使用的接口为RGMII&#xff0c;收发…

fpga 运行linux,如何使用PCIe总线将FPGA板连接到运行Linux的X86主机

步骤1:零件清单 0。运行Ubuntu 1的构建/主机计算机。 Xilinx VC707或KC705板 2。 FPGA板电源线 3。 USB转Micro-USB电缆 4。 8线PCIE带状电缆(可选) 步骤2:将板卡连接到主机 如果外形尺寸如果允许,将板卡直接插入主机板主板上的开放PCIE插槽中。在这些说明中,我们使用的是1…

FPGA 定点数

​ 定点数就是小数位宽不发生改变的数&#xff0c;小数点位置固定。 定点数位宽构成&#xff1a;{符号位&#xff0c;整数位&#xff0c;小数位} 当定点数为有符号数&#xff0c;数据的最高位为符号位&#xff0c;整数位和小数位需要根据精度去定义位宽。 假如一个定点数位…

黑金核心板32bitDDR3 MIG核UI接口仿真模型搭建

图2-4-1为黑金开发板上两片DDR3原理图。 1. 搭建仿真模型时需要例化两个ddr3_model,不然仿真时init_calib_complete信号会一直低。 2.还要考虑信号的延时&#xff0c;需要例化WireDelay模块&#xff0c;如Xilinx官方中给的例程中所示&#xff0c;不然app_rd_data数据一直是红…

基于FPGA的UDP 通信(五)

引言 前文链接&#xff1a; 基于FPGA的UDP 通信&#xff08;一&#xff09; 基于FPGA的UDP 通信&#xff08;二&#xff09; 基于FPGA的UDP 通信&#xff08;三&#xff09; 基于FPGA的UDP 通信&#xff08;四&#xff09; 本文基于FPGA设计千兆以太网通信模块UDP数据发送…

Verilog:【8】基于FPGA实现SD NAND FLASH的SPI协议读写

碎碎念&#xff1a; 终于熬过了期末周&#xff0c;可以开始快乐的开发之旅了。 这一期作为一千粉后的首篇博客&#xff0c;由于之后项目会涉及到相关的部分&#xff0c;因此介绍的是使用FPGA实现SD NAND FLASH的读写操作&#xff0c;以雷龙发展提供的CS创世SD NAND FLASH样品为…

【FPGA算法加速】运行PYNQ,对应FPGA芯片版本:赛灵思黑金AX7020

黑金AX7020开放板实物图&#xff1a; 这里的右下角需要连接本地的路由器&#xff0c;图中并未连上&#xff0c;PC端与FPGA在同一路由的网下&#xff0c;到时候PC端可以在线访问FPGA的资源。 一、连接FPGA硬件设备 1、 SD卡插回开发板&#xff0c;确认开发板启动模式为 SD卡模…

黑金Xilinx FPGA学习笔记(一)verilogHDL扫盲文-(1)

verilog简介 HDL 顾名思义Hardware Description Languag verilog HDL 语言的语法和格式都比较随便&#xff0c;它没有 VDL HDL 语言那么严谨&#xff0c;因此受到了广泛的应用。 0.3RTL级和组合逻辑级 笔者的眼中 Verilog HDL 语言建立的硬件模块可以 分为有时钟源和无时钟…

基于FPGA的示波器设计

目录 一、设计要求 二、系统架构设计 一、设计要求 本次基于FPGA的示波器设计主要技术要求包含以下内容&#xff1a; 系统能够实现模数转换功能&#xff0c;即包含ADC驱动模块&#xff1b;系统能够实现ADC采集数据的缓存功能&#xff1b;系统包含辅助测试模块&#xff0c;DA…

FPGA实现 贪吃蛇

一. 硬件 黑金AX4010AN430显示屏&#xff08;480*272&#xff09;蓝牙模块安卓手机 采用app通过蓝牙模块来操作蛇的移动情况 二. 数据的存储 reg[18:0] Snake[0:7]; //蛇 18:10 x 9:1 y 0 :flag 是否是蛇身 reg[17:0] Food; // 食物三. 蛇的移动的方向 通过上下左右来…

黑金全部开发板资料(FPGA+ZYNQ)分享

黑金开发板 能找到的所有黑金开发板的资料&#xff0c;足够学习使用。 ALTERA CYCLONE 10 黑金开发板ZYNQ7020_2019 黑金zynq7015_2017 黑金zynq7010_2017 …

FPAG—UART串口实现与解析-黑金fpga资料解析

UART实现-黑金fpga开发板案例解析 uart 异步串口通讯 无需时钟线&#xff0c;俩根线一跟复制发数据一根负责收数据。 具体的时序如下图1&#xff1a; 图1&#xff1a;UART时序图 可以看到 当数据线由高位变为地位时&#xff0c;即遇到一个下降沿时刻&#xff0c;表示开始这一…