strtol / strtoul / strtoll
#include
long strtol(const char *nptr, char **endptr, int base);
unsigned long strtoul(const char *nptr, char **endptr, int base);
long long strtoll(const char *nptr, char **endptr, int base);
nptr:待轉換字符串,跳過前導空白,遇非數字停止。endptr:輸出參數,若非 NULL,指向第一個未被轉換的字符。利用此特性可精準判斷「完全無效」或「部分有效」。base:2~36 或 0。
#include
#include
#include
int main() {
char *p;
// 1. 十進制
long x = strtol("100", &p, 10);
printf("x=%ld, next='%s'\n", x, p); // x=100, next=''
// 2. 二進制
long y = strtol("100", &p, 2);
printf("y=%ld, next='%s'\n", y, p); // y=4, next=''
// 3. 十六進制(帶前綴)
long z = strtol("0x11", &p, 16);
printf("z=%ld, next='%s'\n", z, p); // z=17, next=''
// 4. 自動檢測 base=0
long a = strtol("077", &p, 0); // 八進制 63
long b = strtol("0xFF", &p, 0); // 十六進制 255
long c = strtol("123", &p, 0); // 十進制 123
// 5. 錯誤檢測:非數字開頭
errno = 0;
long err = strtol("abc", &p, 10);
if (err == 0 && p == "abc") puts("完全無效輸入");
// 6. 溢出檢測
errno = 0;
long big = strtol("9999999999999999999", &p, 10);
if (errno == ERANGE) puts("溢出!");
}
| 需求 | 函數 | base | 示例輸入 | 結果 |
|---|---|---|---|---|
| 字符串→十進制整數 | strtol | 10 | "-123" | -123 |
| 字符串→二進制整數 | strtol | 2 | "1010" | 10 |
| 字符串→八進制整數 | strtol | 8 | "077" | 63 |
| 字符串→十六進制整數 | strtol | 16 | "0xFF" / "FF" | 255 |
| 自動識別進制 | strtol | 0 | "0xFF" / "077" / "123" | 255 / 63 / 123 |
| 無符號大整數 | strtoul | 0/16/10 | "4294967295" | UINT_MAX |
拋棄 `atoi`,擁抱 `strtol` 族:支援任意進制、完整錯誤報告、可移植、標準 C(C89 起)。配合 `endptr` 做輸入驗證,是解析配置文件、命令行參數、網絡協議的首選。