程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 浮點數字符串轉換成浮點數實現

浮點數字符串轉換成浮點數實現

編輯:關於C語言

 

   之前面試的時候,常給面試者出的一個面試題目是,給定一個字符串,輸出該字符串表示的浮點數的值,要求如下:

 

        寫一個轉換函數,該函數的輸入是一個表示浮點數的字符串,把該字符串轉換成浮點數並輸出。條件:請考慮各種情況,並且代碼中的循環盡量少,不能調用API或者crt庫中的函數。例如:輸入字符串"345.7",則輸出浮點數345.7。接口可以為:float StrToFloatA(TCHAR* pstrfloat);

 

        沒想到完全做對這個題目的人居然不多(上機筆試,函數寫好之後丟到測試機裡面跑一下看是否完全正確),因此自己在空閒時間實現了一下,確實還是有一點難度的。代碼如下:

 

 

/* -------------------------------------------------------------------------

//  文件名     :   StringToFloat.h

//  創建者     :   magictong

//  創建時間    :   2011-9-6 14:14:25

//  功能描述    :   

//

//  $Id: $

// -----------------------------------------------------------------------*/ 

#ifndef __STRINGTOFLOAT_H__ 

#define __STRINGTOFLOAT_H__ 

 

// ------------------------------------------------------------------------- 

float StrToFloatW(wchar_t* pstrfloat); 

float StrToFloatA(char* pstrfloat); 

 

#if defined(UNICODE) || defined(_UNICODE) 

    #define StrToFloat  StrToFloatW 

#else 

    #define StrToFloat  StrToFloatA 

#endif // !UNICODE 

// ------------------------------------------------------------------------- 

// $Log: $ 

 

#endif /* __STRINGTOFLOAT_H__ */ 

 

 

/* -------------------------------------------------------------------------

//  文件名     :   StringToFloat.cpp

//  創建者     :   magictong

//  創建時間    :   2011-9-6 14:14:02

//  功能描述    :   

//

//  $Id: $

// -----------------------------------------------------------------------*/ 

 

#include "stdafx.h" 

#include "StringToFloat.h" 

 

// ------------------------------------------------------------------------- 

 

#pragma warning(disable:4244) 

// ------------------------------------------------------------------------- 

// 函數       : StrToFloatA 

// 功能       : 將一個字符串轉換為浮點數 

// 返回值  : float  

// 參數       : char* pstrfloat 

// 附注       :  

// ------------------------------------------------------------------------- 

float StrToFloatA(char* pstrfloat) 

    // check 

    if (!pstrfloat) 

    { 

        return 0.0; 

    } 

 

    bool bNegative = false; 

    bool bDec = false; 

 

    char* pSor = 0; 

    char chByte = '0'; 

    float fInteger = 0.0; 

    float fDecimal = 0.0; 

    float fDecPower = 0.1f; 

 

    // 進行首位判斷,判斷是否是負數 

    if (pstrfloat[0] == '-') 

    { 

        bNegative = true; 

        pSor = pstrfloat + 1; 

    } 

    else 

    { 

        bNegative = false; 

        pSor = pstrfloat; 

    } 

 

    while (*pSor != '\0') 

    { 

        chByte = *pSor; 

 

        if (bDec) 

        { 

            // 小數 

            if (chByte >= '0' && chByte <= '9') 

            { 

                fDecimal += (chByte - '0') * fDecPower; 

                fDecPower = fDecPower * 0.1; 

            } 

            else 

            { 

                return (bNegative? -(fInteger +  fDecimal): fInteger + fDecimal); 

            } 

        } 

        else 

        { 

            // 整數 

            if (chByte >= '0' && chByte <= '9') 

            { 

                fInteger = fInteger * 10.0 + chByte - '0'; 

            } 

            else if (chByte == '.') 

            { 

                bDec = true; 

            } 

            else 

            { 

                return (bNegative? -fInteger : fInteger); 

            } 

        } 

 

        pSor++; 

    } 

 

    return (bNegative? -(fInteger +  fDecimal): fInteger + fDecimal); 

 

// ------------------------------------------------------------------------- 

// 函數       : StrToFloatW 

// 功能       : 將一個字符串轉換為浮點數 

// 返回值  : float  

// 參數       : char* pstrfloat 

// 附注       :  

// ------------------------------------------------------------------------- 

float StrToFloatW(wchar_t* pstrfloat) 

    // check 

    if (!pstrfloat) 

    { 

        return 0.0; 

    } 

 

    bool bNegative = false;  

    bool bDec = false; 

 

    wchar_t* pSor = 0; 

    wchar_t chByte = L'0'; 

    float fInteger = 0.0; 

    float fDecimal = 0.0; 

    float fDecPower = 0.1f; 

 

    // 進行首位判斷,判斷是否是負數 

    if (pstrfloat[0] == L'-') 

    { 

        bNegative = true; 

        pSor = pstrfloat + 1; 

    } 

    else 

    { 

        bNegative = false; 

        pSor = pstrfloat; 

    } 

 

    while (*pSor != L'\0') 

    { 

        chByte = *pSor; 

 

        if (bDec) 

        { 

            // 小數 

            if (chByte >= L'0' && chByte <= L'9') 

            { 

                fDecimal += (chByte - L'0') * fDecPower; 

                fDecPower = fDecPower * 0.1; 

            } 

            else 

            { 

                return (bNegative? -(fInteger +  fDecimal): fInteger + fDecimal); 

            } 

        } 

        else 

        { 

            // 整數 

            if (chByte >= L'0' && chByte <= L'9') 

            { 

                fInteger = fInteger * 10.0 + chByte - L'0'; 

            } 

            else if (chByte == L'.') 

            { 

                bDec = true; 

            } 

            else 

            { 

                return (bNegative? -fInteger : fInteger); 

            } 

        } 

 

        pSor++; 

    } 

 

    return (bNegative? -(fInteger +  fDecimal): fInteger + fDecimal); 

// ------------------------------------------------------------------------- 

// $Log: $ 

 

        測試用例:

 

// StringToFloatShell.cpp : Defines the entry point for the console application. 

// 

 

#include "stdafx.h" 

#include "StringToFloat.h" 

 

 

int _tmain(int argc, _TCHAR* argv[]) 

{    

    float aaaa = 0; 

    aaaa = StrToFloat(L"12.34"); 

    aaaa = StrToFloat(L"a23"); 

    aaaa = StrToFloat(L"1234"); 

    aaaa = StrToFloat(L"12.34"); 

    aaaa = StrToFloat(L"12.34.56"); 

    aaaa = StrToFloat(L".34"); 

    aaaa = StrToFloat(L"34a"); 

    aaaa = StrToFloat(L"34a.456"); 

    aaaa = StrToFloat(L"-34"); 

    aaaa = StrToFloat(L"-56.34"); 

    aaaa = StrToFloat(L"-3.45.67"); 

    aaaa = StrToFloat(L"-.45.6a"); 

    aaaa = StrToFloat(L"-."); 

    aaaa = StrToFloat(L"-0"); 

    return 0; 

 

        大家可以再找找BUG。

        [END]

摘自 magictong的專欄

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved