字符串轉(zhuǎn)整數(shù)夷蚊,不僅是面試題乘杞椋考題目,也是日常常用函數(shù)箱歧。這里對其中的區(qū)別做一個備注彻犁,便于以后查看。
一汞幢、字符串轉(zhuǎn)整數(shù)
一般使用atoi
或者strtol
微谓,其中strtol
功能會更強一些
// atoi函數(shù)原型
#include <stdlib.h>
int atoi(const char *nptr);
// strtol函數(shù)原型
#include <stdlib.h>
long int strtol(const char *nptr, char **endptr, int base);
正常的轉(zhuǎn)換是等價的,忽略前置空白符仲智,將字符串轉(zhuǎn)換為數(shù)字姻氨。當(dāng)遇到非數(shù)字的字符則截斷,不會報錯。例如:
atoi("123")功戚;//結(jié)果:123
atoi("123abc")似嗤;//結(jié)果:123
atoi(" 123abc");//結(jié)果:123
strtol("123", NULL, 10); //結(jié)果:123
strtol("123abc", NULL, 10); //結(jié)果:123
strtol(" 123abc", NULL, 10); //結(jié)果:123
這里重點講一下strtol
的特殊用法烁落,主要有兩個:
1、endptr
參數(shù)
一般情況下灯萍,我們不關(guān)心這個參數(shù)每聪,所以默認(rèn)填寫NULL。
那什么時候啟用呢熊痴?當(dāng)想判斷字符串是否完全轉(zhuǎn)化
的時候啟用,此時endptr
會指向第一個不能被處理(非數(shù)字和標(biāo)點)的字符诊笤。具體示例如下:
char psz[] = "123abc";
char* endptr = NULL;
printf("%ld\n", strtol(psz, &endptr, 10)); //輸出:123
printf("%s\n", endptr); //此時endptr指向第一個不能被處理的整數(shù)'a'字符巾陕,所以輸出:abc
2、base
參數(shù)
base表述用戶想將字符串轉(zhuǎn)為的進制數(shù)鄙煤,有效值可以設(shè)置從0
或2到36
。
0
值需要特殊說明下凉馆,默認(rèn)采用十進制轉(zhuǎn)換亡资,但如果遇到'0x'/'0X'前置字符會使用16進制轉(zhuǎn)換,遇到'0'前置字符會使用8進制進行轉(zhuǎn)換锥腻。示例如下:
char psz[] = "16";
printf("%ld\n", strtol(psz, NULL, 7":)); //13
其他類似的函數(shù)如下:
ANSI C規(guī)范定義了stof(), atoi(), atol(), strtod(), strtol(), strtoul()等6個可以將字符串轉(zhuǎn)換為數(shù)字的函數(shù)。
C99/C++11規(guī)范中又分別增加了5個函數(shù)京革,分別是atoll(), strtof(), strtold(), strtoll(), strtoull()