函数strtol和strtok详解[通俗易懂]

函数strtol和strtok详解[通俗易懂]一、strtol()函数的原型为:longintstrtol(constchar*nptr,char**endptr,intbase);函数的解释说明  这个函数会将参数nptr字符串根据参数base来转换成长整型数。参数base范围从2至36,或0。参数base代表采的进制方式,如base值为10则采用10进制,若base值为16则采用16进制等。当base值为0

大家好,又见面了,我是你们的朋友全栈君。

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/159040.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • pycharm输入中文乱码_jdbc连接mysql中文乱码

    pycharm输入中文乱码_jdbc连接mysql中文乱码pycharm中文显示乱码的解决方法

    2022年8月29日
    2
  • bs架构与cs架构举例_cs架构嵌入BS

    bs架构与cs架构举例_cs架构嵌入BSBS架构简介指一种软件的开发模式,服务器/浏览器结构,即Browser/Server,最大的特点是不需要安装在手机或者电脑上面,有浏览器就可以使用.例如现在越来越多的软件都是基于BS架构(微信小程序,在线办公软件).拓展B/S架构是对C/S架构的一种变化或者改进的架构.在这种架构下,用户工作页面是通过WWW浏览器实现,极少部分事务逻辑在前端实现,但是主要事务逻辑在服务端实现,形成所谓三层3-tier结构——在下方超链接可了解三层架构3-tier-其实也就和SpringMVC框架层级代码结

    2022年9月10日
    0
  • idea2019 jetbrains 激活码永久_通用破解码

    idea2019 jetbrains 激活码永久_通用破解码,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月17日
    1.5K
  • mysql触发器的作用及语法

    mysql触发器的作用及语法

    2021年11月29日
    38
  • goland 激活码2021(破解版激活)

    goland 激活码2021(破解版激活),https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月17日
    472
  • awk linux 数组,Linux中的awk数组的基本使用方法

    awk linux 数组,Linux中的awk数组的基本使用方法1.awk数组描述在其他的编程语言中,数组的下标都是从0开始的,也就是说,如果想反向引用数组中的第一个元素,则需要引用对应的下标[0],在awk中数组也是通过引用下标的方法,但是在awk中数组的下标是从1开始的,在其他语言中,你可能会习惯于先“声明”一个数组,在awk中,则不用这样,直接为数组的元素赋值即可(其实如果自己给数组赋值,下标从1或者从0开始那就无所谓了!)2.在声明数组时,可能值很多…

    2022年7月19日
    14

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号