函数strtol和strtok详解[通俗易懂](Excel函数公式大全)
一、strtol()函數的原型為:
long int strtol(const char *nptr, char **endptr, int base);
函數的解釋說明
這個函數會將參數nptr字符串根據參數base來轉換成長整型數。參數base范圍從2至36,或0。參數base代表采的進制方式,如base值為10則采用10進制,若base值為16則采用16進制等。當base值為0時則是采用10進制做轉換,但遇到如’0x’前置字符則會使用16進制做轉換、遇到’0’前置字符而不是’0x’的時候會使用8進制做轉換。一開始strtol()會掃描參數nptr字符串,跳過前面的空格字符,直到遇上數字或正負符號才開始做轉換,再遇到非數字或字符串結束時(‘\0’)結束轉換,并將結果返回。若參數endptr不為NULL,則會將遇到不合條件而終止的nptr中的字符指針由endptr返回。
strtol是atoi的增強版
主要體現在這幾方面:
1、不僅可以識別十進制整數,還可以識別其它進制的整數,取決于base參數,比如strtol(“0XDEADbeE~~”, NULL, 16)返回0xdeadbee的值,strtol(“0777~~”, NULL, 8)返回0777的值。
2、endptr是一個傳出參數,函數返回時指向后面未被識別的第一個字符。例如char *pos; strtol(“123abc”, &pos, 10);,strtol返回123,pos指向字符串中的字母a。如果字符串開頭沒有可識別的整數,例如char *pos; strtol(“ABCabc”, &pos, 10);,則strtol返回0,pos指向字符串開頭,可以據此判斷這種出錯的情況,而這是atoi處理不了的。
3、如果字符串中的整數值超出long int的表示范圍(上溢或下溢),則strtol返回它所能表示的最大(或最小)整數,并設置errno為ERANGE,例如strtol(“0XDEADbeef~~”, NULL, 16)返回0x7fffffff并設置errno為ERANGE
多數情況下,endptr設置為NULL, 即不返回非法字符串。
atoi函數原型為:
int atoi(const char *nptr);
用法:將字符串里的數字字符轉化為整形數。返回整形值。
注意:轉化時跳過前面的空格字符,直到遇上數字或正負符號才開始做轉換,而再遇到非數字或字符串結束時(‘/0’)才結束轉換,并將結果返回。
例:
int main()
{
char *ptr1 = "-12345.12";
char *ptr2 = "+1234w34";
char *ptr3 = " 456er12";
char *ptr4 = "789 123";
int a,b,c,d;
a = atoi(ptr1);
b = atoi(ptr2);
c = atoi(ptr3);
d = atoi(ptr4);
printf("a = %d, b = %d, c = %d, d = %d/n", a,b,c,d);
return 0;
}
輸出結果:
a = 12345
,
b = 1234
,
c = 456
,
d = 789
下面看幾個例子:
char buffer[20]="10379cend$3";
char *stop;
printf("%d\n",strtol(buffer, &stop, 2));
printf("%s\n", stop);
輸出結果:
2
379cend$3
char buffer[20]="10379cend$3";
char *stop;
printf("%d\n",strtol(buffer, &stop, 8));
printf("%s\n", stop);
輸出結果:
543
9cend$3
char buffer[20]="10379cend$3";
char *stop;
printf("%d\n",strtol(buffer, &stop, 10));
printf("%s\n", stop);
輸出結果:
10379
cend$3
char buffer[20]="10379cend$3";
char *stop;
printf("%d\n",strtol(buffer, &stop, 16));
printf("%s\n", stop);
輸出結果:
17005006
nd$3
另外,如果base為0,且字符串不是以0x(或者0X)開頭,則按十進制進行轉化。如果base為0或者16,并且字符串以0x(或者0X)開頭,那么,x(或者X)被忽略,字符串按16進制轉化。如果base不等于0和16,并且字符串以0x(或者0X)開頭,那么x被視為非法字符。
例如:
char buffer[20]="0x31da6c";
char *stop;
printf("%d\n",strtol(buffer, &stop, 0));
printf("%s\n", stop);
輸出結果:
3267180
(stop為空)
char buffer[20]="0x31da6c";
char *stop;
printf("%d\n",strtol(buffer, &stop, 13));
printf("%s\n", stop);
輸出結果:
0
0x31da6c
最后,需要說明的是,對于nptr指向的字符串,其開頭和結尾處的空格被忽視,字符串中間的空格被視為非法字符。
例如:
char buffer_1[20]="10379c";
char buffer_2[20]=" 10379c ";
char buffer_3[20]=" 10 379c ";
printf("%d\n",strtol(buffer_1,NULL,0));
printf("%d\n",strtol(buffer_2,NULL,0));
printf("%d\n",strtol(buffer_3,NULL,0));
輸出結果為:
10379
10379
10
二、strtok的函數原型為:
char *strtok(char *s, char *delim)
功能為“Parse S into tokens separated by characters in DELIM.If S is NULL, the saved pointer in SAVE_PTR is used as the next starting point. ” 翻譯成漢語就是:作用于字符串s,以包含在delim中的字符為分界符,將s切分成一個個子串;如果,s為空值NULL,則函數保存的指針SAVE_PTR在下一次調用中將作為起始位置。
函數的返回值為從指向被分割的子串的指針。
這個定義和國內一些網站上的說法有一些差別,正是這些差別導致很多人對strtok沒有一個正確的認識。希望讀者在調用一些函數前,最好能夠讀一讀官方的文檔(多半都是英文的),而非看一些以訛傳訛的資料。
使用strtok需要注意的有以下幾點:
函數的作用是分解字符串,所謂分解,即沒有生成新串,只是在s所指向的內容上做了些手腳而已。因此,源字符串s發生了變化!
最典型用法:
int main( void )
{
char string[] = "A string ,,tokens and some more tokens";
char seps[] = " ";
char *token;
token = strtok( string, seps ); // C4996
// Note: strtok is deprecated; consider using strtok_s instead
while( token != NULL )
{
// While there are tokens in "string"
printf( "%s\n", token );
// Get next token:
token = strtok( NULL, seps ); // C4996
}
}
關于strtok函數的用法見鏈接:http://blog.csdn.net/liuintermilan/article/details/6280816
總結
以上是生活随笔為你收集整理的函数strtol和strtok详解[通俗易懂](Excel函数公式大全)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用脚本进行 SAP Spartacus
- 下一篇: SAP Spartacus 如何使用 A