c語言strtod 函式詳解

2021-08-20 14:11:10 字數 3056 閱讀 7362

網上有很多關於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 

#include

#include

int main(void)

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()函式的引數:

double      strtod( const

char *str, char **str_end );

st

r str

指向字串的指標 en

d_st

r end

_str

指向指標的指標

在未呼叫strtod()函式前,列印字串指標p以及end的位址

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

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

執行結果

0000000000408000

000000000000002

d

接下來在執行迴圈時,列印pend的位址

for (f = strtod(p, &end); p != end; f = strtod(p, &end))

//printf("%f\n", f);

}

輸出

p addr = 0000000000408000

endaddr = 0000000000408006

'111.11' -> 111.110000

p addr = 0000000000408006

endaddr = 000000000040800c

' -2.22' -> -2.220000

p addr = 000000000040800c

endaddr = 0000000000408010

' nan' -> 1.

#qnan0

p addr = 0000000000408010

endaddr = 0000000000408017

' nan(2)' -> 1.

#snan0

p addr = 0000000000408017

endaddr = 000000000040801b

' inf' -> 1.

#inf00

p addr = 000000000040801b

endaddr = 0000000000408030

' 0x1.bc70a3d70a3d7p+6' -> 111.110000

p addr = 0000000000408030

endaddr = 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

int main ()

輸出

length = 2

str = he

length = 3

str = hel

c語言函式詳解

c程式是由函式組成的,我們寫的 都是由主函式main 開始執行的。函式是c程式的基本模組,是用於完成特定任務的程式 單元從函式定義角度看,函式可分為系統函式和使用者定義函式。系統函式,即庫函式 這是由編譯系統提供的,使用者不必自己定義這些函式,可以直接使用他們,如我們常用的列印函式printf 使用...

C語言qsort函式詳解

qsort函式是ansi c標準中提供的,其宣告在stdlib.h檔案中,是根據二分發寫的,其時間複雜度為n log n 其結構為 void qsort void base,size t nelem,size t width,int comp const void const void 其中 bas...

C語言main 函式詳解

c的設計原則是把函式作為程式的構成模組。main 函式稱之為主函式,乙個c程式總是從main 函式開始執行的。在最新的 c99 標準中,只有以下兩種定義方式是正確的 int main void 無引數形式 int main int argc,char argv 帶引數形式 int指明了main 函式...