欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

前言

網(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++中對構(gòu)造函數(shù)和賦值運(yùn)算符的復(fù)制和移動,是C++入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2016-01-01
  • C++實現(xiàn)有向圖鄰接表的構(gòu)建

    C++實現(xiàn)有向圖鄰接表的構(gòu)建

    這篇文章主要為大家詳細(xì)介紹了C++實現(xiàn)有向圖鄰接表的構(gòu)建,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • C++11中l(wèi)ambda、std::function和std:bind詳解

    C++11中l(wèi)ambda、std::function和std:bind詳解

    大家都知道C++11中增加了許多的新特性,下面在這篇文中我們就來聊一下lambda表達(dá)式,閉包,std::function以及std::bind。文中介紹的很詳細(xì),相信對大家具有一定的參考價值,有需要的朋友們下面來一起看看吧。
    2017-01-01
  • C語言實現(xiàn)中國象棋

    C語言實現(xiàn)中國象棋

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)中國象棋,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • c++ 中vector 常見用法

    c++ 中vector 常見用法

    這篇文章主要給大家分享的是c++ 中vector 常見用法,,vector有兩個參數(shù),一個是size,表示當(dāng)前vector容器內(nèi)存儲的元素個數(shù),一個是capacity,表示當(dāng)前vector在內(nèi)存中申請的這片區(qū)域所能容納的元素個數(shù),下面來看看文章的詳細(xì)內(nèi)容,需要的朋友可以參考一下
    2021-11-11
  • C++操作文件進(jìn)行讀取、刪除、修改指定行

    C++操作文件進(jìn)行讀取、刪除、修改指定行

    今天小編就為大家分享一篇關(guān)于C++操作文件進(jìn)行讀取、刪除、修改指定行,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • VC創(chuàng)建進(jìn)程CreateProcess的方法

    VC創(chuàng)建進(jìn)程CreateProcess的方法

    這篇文章主要介紹了VC創(chuàng)建進(jìn)程CreateProcess的方法,涉及VC操作進(jìn)程的基本技巧,需要的朋友可以參考下
    2015-05-05
  • C++ 智能指針的模擬實現(xiàn)實例

    C++ 智能指針的模擬實現(xiàn)實例

    這篇文章主要介紹了C++ 智能指針的模擬實現(xiàn)實例的相關(guān)資料,智能指針是一個類,它把普通指針封裝起來,能實現(xiàn)和普通指針同樣的功能。,需要的朋友可以參考下
    2017-07-07
  • C語言struct結(jié)構(gòu)體介紹

    C語言struct結(jié)構(gòu)體介紹

    C語言中,結(jié)構(gòu)體類型屬于一種構(gòu)造類型(其他的構(gòu)造類型還有:數(shù)組類型,聯(lián)合類型),下面這篇文章主要給大家介紹了關(guān)于C語言結(jié)構(gòu)體(struct)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • C語言編程中從密碼文件獲取數(shù)據(jù)的函數(shù)總結(jié)

    C語言編程中從密碼文件獲取數(shù)據(jù)的函數(shù)總結(jié)

    這篇文章主要介紹了C語言編程中從密碼文件獲取數(shù)據(jù)的函數(shù)總結(jié),包括getpw()函數(shù)和getpwnam()函數(shù)以及getpwuid()函數(shù),需要的朋友可以參考下
    2015-08-08

最新評論