C語言strtod()函數(shù)案例詳解
前言
網(wǎng)上有很多關(guān)于strtod()函數(shù)的文章,不過大部分都是用strtod()函數(shù)轉(zhuǎn)換一個字符
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ù), 只是對其中的代碼示例進(jìn)行解釋,當(dāng)然我理解示例代碼時遇到了一點問題,在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)時,打印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指針總會指向當(dāng)前字符串中某一個字符的下一個字符,p指針會指向當(dāng)前字符串中某一個字符
因此p = end這條語句實現(xiàn)了對字符串中的所有字符進(jìn)行strtod()操作,而當(dāng)for (f = strtod(p, &end); p != end; f = strtod(p, &end))語句中的p = end時,也即是沒有字符需要進(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)計算長度, %.*s中的*代表長度,也即是從當(dāng)前字符串中選取多少個字符進(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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解C++中對構(gòu)造函數(shù)和賦值運(yùn)算符的復(fù)制和移動操作
這篇文章主要介紹了C++中對構(gòu)造函數(shù)和賦值運(yùn)算符的復(fù)制和移動,是C++入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2016-01-01C++11中l(wèi)ambda、std::function和std:bind詳解
大家都知道C++11中增加了許多的新特性,下面在這篇文中我們就來聊一下lambda表達(dá)式,閉包,std::function以及std::bind。文中介紹的很詳細(xì),相信對大家具有一定的參考價值,有需要的朋友們下面來一起看看吧。2017-01-01VC創(chuàng)建進(jìn)程CreateProcess的方法
這篇文章主要介紹了VC創(chuàng)建進(jìn)程CreateProcess的方法,涉及VC操作進(jìn)程的基本技巧,需要的朋友可以參考下2015-05-05C語言編程中從密碼文件獲取數(shù)據(jù)的函數(shù)總結(jié)
這篇文章主要介紹了C語言編程中從密碼文件獲取數(shù)據(jù)的函數(shù)總結(jié),包括getpw()函數(shù)和getpwnam()函數(shù)以及getpwuid()函數(shù),需要的朋友可以參考下2015-08-08