之前面試的時候,常給面試者出的一個面試題目是,給定一個字符串,輸出該字符串表示的浮點數的值,要求如下:
寫一個轉換函數,該函數的輸入是一個表示浮點數的字符串,把該字符串轉換成浮點數並輸出。條件:請考慮各種情況,並且代碼中的循環盡量少,不能調用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的專欄