標準庫提供多組轉換函數,按返回類型與錯誤處理能力分級。
int num = atoi("100"); // 字符串 → int
long ln = atol("12345"); // 字符串 → long
double d = atof("3.14"); // 字符串 → double
| 函數 | 返回類型 | 特性 |
|---|---|---|
strtol | long | 支持基數(2~36),endptr 返回未轉換部分 |
strtoul | unsigned long | 無符號長整型,溢出返回 ULONG_MAX 並置 errno=ERANGE |
strtod | double | 雙精度浮點,同樣支持 endptr 與 errno |
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <errno.h>
int main() {
char *str = "1234567891011121314151617181920";
char *leftover;
errno = 0;
unsigned long num = strtoul(str, &leftover, 10);
printf("Original: %s\nConverted: %lu\nLeftover: %s\nerrno: %d\n",
str, num, leftover, errno);
// 輸出:Converted: 4294967295 (ULONG_MAX), errno=ERANGE
return 0;
}
endptr(此處 leftover)指向導致停止的字符,可用於解析「數字+單位」格式(如 "100px")。errno == ERANGE 明確指示溢出。0x(十六進制)、0(八進制)前綴。atoi/atof 碼少快。strtol/strtod。atoi(累乘加減)。掌握 strto* 族函數,是編寫健壯 C 解析代碼的基本功。