最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言strtod()函數(shù)案例詳解

 更新時間:2021年07月23日 10:17:46   作者:eye_water  
這篇文章主要介紹了C語言strtod()函數(shù)案例詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下

前言

網(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++中Covariant返回值類型詳解

    C++中Covariant返回值類型詳解

    這篇文章主要介紹了C++中Covariant返回值類型詳解,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的朋友可以可以參考一下
    2022-09-09
  • C語言中等待socket連接和對socket定位的方法

    C語言中等待socket連接和對socket定位的方法

    這篇文章主要介紹了C語言中等待socket連接和對socket定位的方法,分別為listen()函數(shù)和bind()函數(shù)的用法,需要的朋友可以參考下
    2015-09-09
  • C++使用yaml-cpp庫操作YAML的示例代碼

    C++使用yaml-cpp庫操作YAML的示例代碼

    配置文件有利于我們靈活配置工程,解決大量重復勞動,也方便調(diào)試,YAML?是一種人類可讀的數(shù)據(jù)序列化格式,它使用縮進和特定的符號來表示數(shù)據(jù)結構,在本文中,我們將詳細介紹如何在?C++?中使用?yaml-cpp?庫來解析和生成?YAML?格式的數(shù)據(jù),需要的朋友可以參考下
    2024-10-10
  • C++實現(xiàn)猜數(shù)字小游戲

    C++實現(xiàn)猜數(shù)字小游戲

    這篇文章主要為大家詳細介紹了C++實現(xiàn)猜數(shù)字小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • gdb調(diào)試的簡單操作總結

    gdb調(diào)試的簡單操作總結

    gdb是一個命令行下的、功能強大的調(diào)試器,這篇文章主要為大家詳細介紹了gdb?調(diào)試的一些簡單操作,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-08-08
  • c++中拷貝構造函數(shù)的參數(shù)類型必須是引用

    c++中拷貝構造函數(shù)的參數(shù)類型必須是引用

    如果拷貝構造函數(shù)中的參數(shù)不是一個引用,即形如CClass(const CClass c_class),那么就相當于采用了傳值的方式(pass-by-value),而傳值的方式會調(diào)用該類的拷貝構造函數(shù),從而造成無窮遞歸地調(diào)用拷貝構造函數(shù)。因此拷貝構造函數(shù)的參數(shù)必須是一個引用
    2013-07-07
  • C語言實現(xiàn)飛機票務系統(tǒng)

    C語言實現(xiàn)飛機票務系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)飛機票務系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • C語言關鍵字總結解析

    C語言關鍵字總結解析

    這篇文章主要介紹了C語言關鍵字總結解析,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是本文的詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++之友元:友元函數(shù)和友元類詳解

    C++之友元:友元函數(shù)和友元類詳解

    友元是一種允許非類成員函數(shù)訪問類的非公有成員的一種機制??梢园岩粋€函數(shù)指定為類的友元,也可以把整個類指定為另一個類的友元
    2013-09-09
  • 使用CMake構建一個簡單的C++項目的實現(xiàn)

    使用CMake構建一個簡單的C++項目的實現(xiàn)

    CMake是一個跨平臺的自動化構建工具,可以用于構建各種類型的項目,本文主要介紹了使用CMake構建一個簡單的C++項目,具有一定的參考價值,感興趣的可以了解一下
    2023-10-10

最新評論

浦东新区| 交口县| 邯郸县| 泽州县| 仲巴县| 依安县| 玛纳斯县| 富锦市| 青神县| 湖州市| 梁山县| 中宁县| 八宿县| 会宁县| 祁门县| 九寨沟县| 河津市| 嵊州市| 锦州市| 梅河口市| 鹤壁市| 晋江市| 延庆县| 灵武市| 隆安县| 沙洋县| 正镶白旗| 石嘴山市| 阳山县| 偃师市| 丹阳市| 拜城县| 泰和县| 呼伦贝尔市| 杭锦后旗| 尉犁县| 通渭县| 望城县| 河间市| 慈利县| 永登县|