C語言strtod()函數(shù)案例詳解
前言
網(wǎng)上有很多關于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ù), 只是對其中的代碼示例進行解釋,當然我理解示例代碼時遇到了一點問題,在StackOverflow提問了以下,結果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);
運行結果
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指針總會指向當前字符串中某一個字符的下一個字符,p指針會指向當前字符串中某一個字符

因此p = end這條語句實現(xiàn)了對字符串中的所有字符進行strtod()操作,而當for (f = strtod(p, &end); p != end; f = strtod(p, &end))語句中的p = end時,也即是沒有字符需要進行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中的*代表長度,也即是從當前字符串中選取多少個字符進行打印
示例代碼:
#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()函數(shù)案例詳解的文章就介紹到這了,更多相關C語言strtod()函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
c++中拷貝構造函數(shù)的參數(shù)類型必須是引用
如果拷貝構造函數(shù)中的參數(shù)不是一個引用,即形如CClass(const CClass c_class),那么就相當于采用了傳值的方式(pass-by-value),而傳值的方式會調(diào)用該類的拷貝構造函數(shù),從而造成無窮遞歸地調(diào)用拷貝構造函數(shù)。因此拷貝構造函數(shù)的參數(shù)必須是一個引用2013-07-07

