淺析C語(yǔ)言中strtol()函數(shù)與strtoul()函數(shù)的用法
C語(yǔ)言strtol()函數(shù):將字符串轉(zhuǎn)換成long(長(zhǎng)整型數(shù))
頭文件:
#include <stdlib.h>
strtol() 函數(shù)用來(lái)將字符串轉(zhuǎn)換為長(zhǎng)整型數(shù)(long),其原型為:
long int strtol (const char* str, char** endptr, int base);
【參數(shù)說(shuō)明】str 為要轉(zhuǎn)換的字符串,endstr 為第一個(gè)不能轉(zhuǎn)換的字符的指針,base 為字符串 str 所采用的進(jìn)制。
【函數(shù)說(shuō)明】strtol() 會(huì)將參數(shù) str 字符串根據(jù)參數(shù) base 來(lái)轉(zhuǎn)換成長(zhǎng)整型數(shù)(long)。參數(shù) base 范圍從2 至36,或0。參數(shù)base 代表 str 采用的進(jìn)制方式,如base 值為10 則采用10 進(jìn)制,若base 值為16 則采用16 進(jìn)制等。
strtol() 會(huì)掃描參數(shù) str 字符串,跳過(guò)前面的空白字符(例如空格,tab縮進(jìn)等,可以通過(guò) isspace() 函數(shù)來(lái)檢測(cè)),直到遇上數(shù)字或正負(fù)符號(hào)才開(kāi)始做轉(zhuǎn)換,再遇到非數(shù)字或字符串結(jié)束時(shí)('\0')結(jié)束轉(zhuǎn)換,并將結(jié)果返回。
兩點(diǎn)注意:
- 當(dāng) base 的值為 0 時(shí),默認(rèn)采用 10 進(jìn)制轉(zhuǎn)換,但如果遇到 '0x' / '0X' 前置字符則會(huì)使用 16 進(jìn)制轉(zhuǎn)換,遇到 '0' 前置字符則會(huì)使用 8 進(jìn)制轉(zhuǎn)換。
- 若endptr 不為NULL,則會(huì)將遇到的不符合條件而終止的字符指針由 endptr 傳回;若 endptr 為 NULL,則表示該參數(shù)無(wú)效,或不使用該參數(shù)。
【返回值】返回轉(zhuǎn)換后的長(zhǎng)整型數(shù);如果不能轉(zhuǎn)換或者 str 為空字符串,那么返回 0(0L);如果轉(zhuǎn)換得到的值超出 long int 所能表示的范圍,函數(shù)將返回 LONG_MAX 或 LONG_MIN(在 limits.h 頭文件中定義),并將 errno 的值設(shè)置為 ERANGE。
【示例】將字符串轉(zhuǎn)換成10進(jìn)制。
#include <stdio.h>
#include <stdlib.h>
int main ()
{
char szNumbers[] = "2001 60c0c0 -1101110100110100100000 0x6fffff";
char * pEnd;
long int li1, li2, li3, li4;
li1 = strtol (szNumbers,&pEnd,10);
li2 = strtol (pEnd,&pEnd,16);
li3 = strtol (pEnd,&pEnd,2);
li4 = strtol (pEnd,NULL,0);
printf ("轉(zhuǎn)換成10進(jìn)制: %ld、%ld、%ld、%ld\n", li1, li2, li3, li4);
system("pause");
return 0;
}
執(zhí)行結(jié)果:
轉(zhuǎn)換成10進(jìn)制:
2001、6340800、-3624224、7340031
C語(yǔ)言strtoul()函數(shù):將字符串轉(zhuǎn)換成unsigned long(無(wú)符號(hào)長(zhǎng)整型數(shù))
頭文件:
#include <stdlib.h>
strtoul() 函數(shù)源自于“string to unsigned long”,用來(lái)將字符串轉(zhuǎn)換成無(wú)符號(hào)長(zhǎng)整型數(shù)(unsigned long),其原型為:
unsigned long strtoul (const char* str, char** endptr, int base);
【參數(shù)說(shuō)明】str 為要轉(zhuǎn)換的字符串,endstr 為第一個(gè)不能轉(zhuǎn)換的字符的指針,base 為字符串 str 所采用的進(jìn)制。
【函數(shù)說(shuō)明】strtoul() 會(huì)將參數(shù) str 字符串根據(jù)參數(shù) base 來(lái)轉(zhuǎn)換成無(wú)符號(hào)的長(zhǎng)整型數(shù)(unsigned long)。參數(shù) base 范圍從2 至36,或0。參數(shù) base 代表 str 采用的進(jìn)制方式,如 base 值為10 則采用10 進(jìn)制,若 base 值為16 則采用16 進(jìn)制數(shù)等。
strtoul() 會(huì)掃描參數(shù) str 字符串,跳過(guò)前面的空白字符(例如空格,tab縮進(jìn)等,可以通過(guò) isspace() 函數(shù)來(lái)檢測(cè)),直到遇上數(shù)字或正負(fù)符號(hào)才開(kāi)始做轉(zhuǎn)換,再遇到非數(shù)字或字符串結(jié)束時(shí)('\0')結(jié)束轉(zhuǎn)換,并將結(jié)果返回。
兩點(diǎn)注意:
- 當(dāng) base 的值為 0 時(shí),默認(rèn)采用 10 進(jìn)制轉(zhuǎn)換,但如果遇到 '0x' / '0X' 前置字符則會(huì)使用 16 進(jìn)制轉(zhuǎn)換,遇到 '0' 前置字符則會(huì)使用 8 進(jìn)制轉(zhuǎn)換。
- 若 endptr 不為NULL,則會(huì)將遇到的不符合條件而終止的字符指針由 endptr 傳回;若 endptr 為 NULL,則表示該參數(shù)無(wú)效,或不使用該參數(shù)。本文最后的范例沒(méi)有展示 endptr 參數(shù)的使用,你可以參考 strtol() 函數(shù)的范例來(lái)更加直觀地了解 endptr 參數(shù)。
【返回值】返回轉(zhuǎn)換后的無(wú)符號(hào)長(zhǎng)整型數(shù);如果不能轉(zhuǎn)換或者 str 為空字符串,那么返回 0;如果轉(zhuǎn)換得到的值超出unsigned long int 所能表示的范圍,函數(shù)將返回 ULONG_MAX(在 limits.h 頭文件中定義),并將 errno 的值設(shè)置為 ERANGE。
溫馨提示:ANSI C 規(guī)范定義了 stof()、atoi()、atol()、strtod()、strtol()、strtoul() 共6個(gè)可以將字符串轉(zhuǎn)換為數(shù)字的函數(shù),大家可以對(duì)比學(xué)習(xí)。另外在 C99 / C++11 規(guī)范中又新增了5個(gè)函數(shù),分別是 atoll()、strtof()、strtold()、strtoll()、strtoull(),在此不做介紹,請(qǐng)大家自行學(xué)習(xí)。
范例:將輸入的字符串轉(zhuǎn)換為無(wú)符號(hào)長(zhǎng)整型。
#include <stdio.h>
#include <stdlib.h>
int main ()
{
char buffer [256];
unsigned long ul;
printf ("Enter an unsigned number: ");
fgets (buffer, 256, stdin);
ul = strtoul (buffer, NULL, 0);
printf ("Value entered: %lu.\n", ul);
system("pause");
return 0;
}
運(yùn)行結(jié)果:
Enter an unsigned number: 017cyuyan Value entered: 15.
由于 base 參數(shù)被設(shè)置為 0 并且字符串“017cyuyan”以“0”開(kāi)頭,所以采用 8 進(jìn)制轉(zhuǎn)換。
相關(guān)文章
C++實(shí)現(xiàn)棧與分析棧的知識(shí)點(diǎn)
這篇文章主要介紹了C++實(shí)現(xiàn)棧與分析棧的知識(shí)點(diǎn),棧(stack)是計(jì)算機(jī)中常用的一種線性數(shù)據(jù)結(jié)構(gòu),經(jīng)常有資料使用“操作受限”來(lái)形容棧,因?yàn)樗膲喝霔:蛷棾鰲2僮髦荒茉跅m斶M(jìn)行,下文更多相關(guān)資料,需要的小伙伴可以參考一下2022-03-03
Visual Studio 2019創(chuàng)建C++ Hello World項(xiàng)目的方法
這篇文章主要介紹了Visual Studio 2019創(chuàng)建C++ Hello World項(xiàng)目的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
C++ Boost命令行解析庫(kù)的應(yīng)用詳解
命令行解析庫(kù)是一種用于簡(jiǎn)化處理命令行參數(shù)的工具,它可以幫助開(kāi)發(fā)者更方便地解析命令行參數(shù)并提供適當(dāng)?shù)膸椭畔?本文主要介紹了不同的命令行解析庫(kù)和它們?cè)贑++項(xiàng)目中的應(yīng)用,希望對(duì)大家有所幫助2023-11-11
C語(yǔ)言實(shí)現(xiàn)BMP圖像處理(彩色圖轉(zhuǎn)灰度圖)
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)BMP圖像處理,彩色圖轉(zhuǎn)灰度圖,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10
C語(yǔ)言實(shí)現(xiàn)循環(huán)鏈表
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)循環(huán)鏈表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-07-07
C++詳細(xì)講解內(nèi)存管理工具primitives
文章向大家介紹C++內(nèi)存管理primitives,主要包括primitives使用實(shí)例、應(yīng)用技巧、基本知識(shí)點(diǎn)總結(jié)和需要注意事項(xiàng),具有一定的參考價(jià)值,需要的朋友可以參考一下2022-06-06

