模板
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
注意事項
更新紀錄
2019-9-6