函数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
- 函数strtol和strtok详解
- strtok和strsep函数详解
- strtok和strsep函数详解
- strtok和strsep函数详解
- strtok和strsep函数详解
- strtok和strsep函数详解
- strtok和strsep函数详解
- strtok和strsep函数详解
- strtol() 函数详解
- strtol()函数详解
- strtol函数详解
- strtol 函数详解
- strtol 和ltoa函数
- C函数Strtok详解
- strtok函数详解
- strtok函数详解
- strtok和strtok_r函数
- 长字符串解析--Strtok函数详解和实例
- hdu 1503 Advanced Fruits(最长公共子序列变形)
- 题目1214:丑数
- 从Linux内核代码中学习获得结构体成员偏移量的方法
- int main(int argc,char* argv[])详解
- 【struts】Unable to load configuration 相关仔细查看报错信息
- 函数strtol和strtok详解
- 有序的结构体数组四
- hdu2196 Computers 树形DP
- UIResponder类的介绍
- Unity3 游戏优化 - 缓存(重复利用)物体
- AOJ - 0005 GCD and LCM (O(logn)求最大公约数,最小公倍数)
- Path Sum
- 解决nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
- Github for windows 安装教程(历尽千辛终于可以安装了)