函数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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • C# 深拷贝_python的浅拷贝和深拷贝

    C# 深拷贝_python的浅拷贝和深拷贝C#中的浅复制和深复制示例在本文中,我将通过示例讨论C#中的浅拷贝和深拷贝。这是我们上一篇文章的续篇。因此,在继续本文之前,请阅读我们以前的文章,其中我们使用示例讨论了C#中的原型设计模式。浅复制和深复制在复制原型设计模式中的对象中起着重要作用。因此,在本文中,我们将通过示例讨论什么是“浅复制”和“深复制”以及它们之间的区别。了解C#中的浅表复制:如果是“浅复制”,它将从现有对象创建新对象,然后将当前对象的值类型字段复制到新对象。但是在引用类型的情况下,它将仅复制引用,而不复制被引用对象本身

    2022年9月29日
    4
  • MSDN 6.0 之 Platform SDK 内容导航

    MSDN 6.0 之 Platform SDK 内容导航MSDN6.0之PlatformSDK内容导航王天平,北京,荣丰20082005年7月3日从头文件说起实际上在每个用C编写的Windows程式的开头都可看到:#includeWINDOWS.H是主要的引入头文件,它包含了其他Windows头文件,这些头文件的某些也包含了其他头文件。这些头文件中最重要的和最基本的是:l        WINDEF.H基本类型定义。l        

    2022年6月3日
    61
  • mysql中如何修改表的名字?修改表名?

    mysql中如何修改表的名字?修改表名?mysql>createtablets01liketi_o_sms;#创建表结构.这样的建表方式,不仅仅是表的结构,连带着索引也会同时创建.QueryOK,0rowsaffected(0.02sec)mysql>altertablets01renametots01_new;#修改表名的语法:altertablerenameto/asnew_tablename;QueryOK,0rowsaffected(0.00s.

    2022年5月31日
    61
  • 使用withCount后再使用select设置查询的字段。就找不到withCount的数据了

    使用withCount后再使用select设置查询的字段。就找不到withCount的数据了

    2021年11月8日
    36
  • nacicat15激活码-激活码分享

    (nacicat15激活码)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html2KLKA7BQFO-eyJsaWN…

    2022年4月1日
    68
  • mediumtext_text长度不够用,改为mediumtext感觉 又太大,有没什么方法?

    mediumtext_text长度不够用,改为mediumtext感觉 又太大,有没什么方法?楼主先要搞清楚,text和longtext这些都是可变长度的字段类型.这是phpMyAdmin里的说明:text:最多存储65535(2^16-1)字节的文本字段,存储时在内容前使用2字节表示内容的字节数.longtext:最多存储4294967295字节即4GB(2^32-1)的文本字段,存储时在内容前使用4字节表示内容的字节数.也就是说,你在longtext类型的字段里只存1个字符,占用空…

    2022年5月1日
    81

发表回复

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

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