函数strtol和strtok详解

来源:互联网 发布:免费手机小号软件 编辑:程序博客网 时间:2024/05/29 05:11

一、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

0 0
原创粉丝点击