Test Message

[模板] 字串取值

模板

getInt()

inline char* getInt(register char buffer[], register int* dst)
{
while (*buffer < '-')
if (!*buffer++) return NULL;
if (*buffer == '-')
{
*dst = *++buffer ^ '0';
while (*++buffer >= '0')
* dst = (*dst << 3) + (*dst << 1) + (*buffer ^ '0');
*dst = ~*dst + 1;
}
else
{
*dst = *buffer ^ '0';
while (*++buffer >= '0')
* dst = (*dst << 3) + (*dst << 1) + (*buffer ^ '0');
}
return buffer;
}

getUInt()

inline char* getUInt(register char buffer[],register unsigned int* dst)
{
while (*buffer < '0')
if (!*buffer++) return NULL;
*dst = *buffer ^ '0';
while (*++buffer >= '0')
* dst = (*dst << 3) + (*dst << 1) + (*buffer ^ '0');
return buffer;
}

getLongLong()

inline char* getLongLong(register char buffer[],register long long* dst)
{
while (*buffer < '-')
if (!*buffer++) return NULL;
if (*buffer == '-')
{
*dst = *++buffer ^ '0';
while (*++buffer >= '0')
* dst = (*dst << 3) + (*dst << 1) + (*buffer ^ '0');
*dst = ~*dst + 1;
}
else
{
*dst = *buffer ^ '0';
while (*++buffer >= '0')
* dst = (*dst << 3) + (*dst << 1) + (*buffer ^ '0');
}
return buffer;
}

getULongLong()

inline char* getULongLong(register char buffer[],register unsigned long long* dst)
{
while (*buffer < '0')
if (!*buffer++) return NULL;
*dst = *buffer ^ '0';
while (*++buffer >= '0')
* dst = (*dst << 3) + (*dst << 1) + (*buffer ^ '0');
return buffer;
}

getDouble()

inline char* getDouble(register char buffer[],register double* dst)
{
register char nag;
while (*buffer < '-')
if (!*buffer++) return NULL;
if (*buffer == '-')
nag = 1, *dst = *++buffer ^ '0';
else
nag = 0, *dst = *buffer ^ '0';
while (*++buffer >= '0')
* dst = *dst * 10 + (*buffer ^ '0');
if (*buffer == '.')
{
register double m = 1;
while (*++buffer >= '0')
* dst += (*buffer ^ '0') * (m *= 0.1);
}
if (nag)* dst = -*dst;
return buffer;
}

概述

本組模板為字串轉數字模板,使用此模板取代 sscanf() 可以大幅減少從字串取得數組的時間,此外本模板內建指針偏移,可以節省使用 strlen() 偏移指針的開銷。

參數

buffer

本參數為來源字串。

dst

本參數用來接收格式化後的數值。

返回值

該函數返回最後一個格式化數字的下一位元指標,如果過濾字元時檢索到空字元 ('\0'),則返回一個空指標。

實例

#include <stdio.h>

inline char* getInt(char buffer[], int* dst)
{
while (*buffer < '-')
if (!*buffer++) return NULL;
if (*buffer == '-')
{
*dst = *++buffer ^ '0';
while (*++buffer >= '0')
* dst = (*dst << 3) + (*dst << 1) + (*buffer ^ '0');
*dst = ~*dst + 1;
}
else
{
*dst = *buffer ^ '0';
while (*++buffer >= '0')
* dst = (*dst << 3) + (*dst << 1) + (*buffer ^ '0');
}
return buffer;
}

int main()
{
char input[1000] = "123 20 0 -17", * st = input;
int val;
while (st = getInt(&val, st))
{
printf("%d\n", val);
}
return 0;
}
編譯運行結果

123
20
0
-17

注意事項

  • 為了加快速度,過濾字元時使用 (ch < '0' (有號為'-'))、判斷數字使用 (ch >= '0') 作為字元判斷依據如果字串中包含不符合條件的字元請自行修改判斷式或採用以下嚴格判斷的方式避免錯誤。

    有號

    (((ch = readChar()) < '0' || ch > '9') && ch != '-')

    無號

    ((ch = readChar()) < '0' || ch > '9')

    判斷數字

    ((ch = readChar()) >= '0' && ch <= '9')

  • 如果情況允許,使用整數型態模擬浮點運算,因為整數型態運算速度遠高於浮點,且不會有失真問題。

更新紀錄

2019-9-6
  • 傳入參數改為 register