C語言strtod()函數(shù)案例詳解
前言
網(wǎng)上有很多關(guān)于strtod()函數(shù)的文章,不過大部分都是用strtod()函數(shù)轉(zhuǎn)換一個(gè)字符
char *str = "111.11"; char *target; double ret; ret = strtod(str, &target);
很少有轉(zhuǎn)換字符串的這樣的用法
char *p = "111.11 -2.22 Nan nan(2) inF 0X1.BC70A3D70A3D7P+6 1.18973e+4932zzz";
本文主要參考strtod()函數(shù), 只是對(duì)其中的代碼示例進(jìn)行解釋,當(dāng)然我理解示例代碼時(shí)遇到了一點(diǎn)問題,在StackOverflow提問了以下,結(jié)果Barmar大神直接把代碼解釋了一遍,很佩服這位大神,StackOverflow版鏈接
代碼分析
#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:
p = end //這條語句是干什么用的?
strtod()函數(shù)的參數(shù):
double strtod( const char *str, char **str_end );
str s t r 指向字符串的指針
end_str e n d _ s t r 指向指針的指針
在未調(diào)用strtod()函數(shù)前,打印字符串指針p以及end的地址
printf("%p\n", p);
printf("%p\n", end);
運(yùn)行結(jié)果
0000000000408000 000000000000002D
接下來在執(zhí)行循環(huán)時(shí),打印p和end的地址
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
可以發(fā)現(xiàn)end指針總會(huì)指向當(dāng)前字符串中某一個(gè)字符的下一個(gè)字符,p指針會(huì)指向當(dāng)前字符串中某一個(gè)字符

因此p = end這條語句實(shí)現(xiàn)了對(duì)字符串中的所有字符進(jìn)行strtod()操作,而當(dāng)for (f = strtod(p, &end); p != end; f = strtod(p, &end))語句中的p = end時(shí),也即是沒有字符需要進(jìn)行strtod()操作了,就可以退出循環(huán)
問題2:
printf("'%.*s' -> ", (int)(end-p), p);
打印出的為什么是一系列字符,如:
'111.11' ' -2.22' ' Nan' ' nan(2)' ' inF' ' 0X1.BC70A3D70A3D7P+6' ' 1.18973e+4932'
(int)(end - p)計(jì)算長度, %.*s中的*代表長度,也即是從當(dāng)前字符串中選取多少個(gè)字符進(jìn)行打印
示例代碼:
#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
到此這篇關(guān)于C語言strtod()函數(shù)案例詳解的文章就介紹到這了,更多相關(guān)C語言strtod()函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C語言中等待socket連接和對(duì)socket定位的方法
這篇文章主要介紹了C語言中等待socket連接和對(duì)socket定位的方法,分別為listen()函數(shù)和bind()函數(shù)的用法,需要的朋友可以參考下2015-09-09
c++中拷貝構(gòu)造函數(shù)的參數(shù)類型必須是引用
如果拷貝構(gòu)造函數(shù)中的參數(shù)不是一個(gè)引用,即形如CClass(const CClass c_class),那么就相當(dāng)于采用了傳值的方式(pass-by-value),而傳值的方式會(huì)調(diào)用該類的拷貝構(gòu)造函數(shù),從而造成無窮遞歸地調(diào)用拷貝構(gòu)造函數(shù)。因此拷貝構(gòu)造函數(shù)的參數(shù)必須是一個(gè)引用2013-07-07
C語言實(shí)現(xiàn)飛機(jī)票務(wù)系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)飛機(jī)票務(wù)系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12
使用CMake構(gòu)建一個(gè)簡單的C++項(xiàng)目的實(shí)現(xiàn)
CMake是一個(gè)跨平臺(tái)的自動(dòng)化構(gòu)建工具,可以用于構(gòu)建各種類型的項(xiàng)目,本文主要介紹了使用CMake構(gòu)建一個(gè)簡單的C++項(xiàng)目,具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10

