精华内容
下载资源
问答
  • strtol

    2019-12-07 10:53:11
    strtol 将字符串转换成长整型数 相关函数 atof,atoi,atol,strtod,strtoul 表头文件 #include <stdlib.h> 定义函数 long int strtol(const char *nptr, char **endptr, int base); 函数说明 ...

    strtol

    将字符串转换成长整型数

    相关函数

    atof,atoi,atol,strtod,strtoul

    表头文件

    #include <stdlib.h>
    

    定义函数

    long int strtol(const char *nptr, char **endptr, int base);
    

    函数说明

    strtol()会将参数nptr字符串根据参数base来转换成长整型数。参数base范围从2至36,或0。参数base代表采用的进制方式,如base值为10则采用10进制,若base值为16则采用16进制等。当base值为0时则是采用10进制做转换,但遇到如'0x'前置字符则会使用16进制做转换。一开始strtol()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,再遇到非数字或字符串结束时('\0')结束转换,并将结果返回。若参数endptr不为NULL,则会将遇到不合条件而终止的nptr中的字符指针由endptr返回。

    返回值

    返回转换后的长整型数,否则返回ERANGE并将错误代码存入errno中。

    附加说明

    ERANGE指定的转换字符串超出合法范围。

    范例

    /* 将字符串a,b,c 分别采用10,2,16进制转换成数字*/
    #include <stdlib.h>
    #include <stdio.h>
    
    int main()
    {
            char a[] = "10000000000";
            char b[] = "10000000000";
            char c[] = "ffff";
    
            printf("a = %ld\n",strtol(a,NULL,10));
            printf("b = %ld\n",strtol(b,NULL,2));
            printf("c = %ld\n",strtol(c,NULL,16));
    
            return 0;
    }
    

    执行

    a = 10000000000
    b = 1024
    c = 65535
    

    man 

    STRTOL(3)                                 Linux Programmer's Manual                                STRTOL(3)
    
    NAME
           strtol, strtoll, strtoq - convert a string to a long integer
    
    SYNOPSIS
           #include <stdlib.h>
    
           long int strtol(const char *nptr, char **endptr, int base);
    
           long long int strtoll(const char *nptr, char **endptr, int base);
    
       Feature Test Macro Requirements for glibc (see feature_test_macros(7)):
    
           strtoll():
               _XOPEN_SOURCE >= 600 || _BSD_SOURCE || _SVID_SOURCE || _ISOC99_SOURCE ||
               _POSIX_C_SOURCE >= 200112L;
               or cc -std=c99
    
    DESCRIPTION
           The strtol() function converts the initial part of the string in nptr to a long integer value accord‐
           ing to the given base, which must be between 2 and 36 inclusive, or be the special value 0.
    
           The  string  may begin with an arbitrary amount of white space (as determined by isspace(3)) followed
           by a single optional '+' or '-' sign.  If base is zero or 16, the string may then include a "0x" pre‐
           fix,  and  the number will be read in base 16; otherwise, a zero base is taken as 10 (decimal) unless
           the next character is '0', in which case it is taken as 8 (octal).
    
           The remainder of the string is converted to a long int value in the obvious manner, stopping  at  the
           first  character which is not a valid digit in the given base.  (In bases above 10, the letter 'A' in
           either uppercase or lowercase represents 10, 'B' represents 11, and so forth, with  'Z'  representing
           35.)
    
           If  endptr  is  not  NULL, strtol() stores the address of the first invalid character in *endptr.  If
           there were no digits at all, strtol() stores the original value of nptr in *endptr (and  returns  0).
           In particular, if *nptr is not '\0' but **endptr is '\0' on return, the entire string is valid.
    
           The strtoll() function works just like the strtol() function but returns a long long integer value.
    RETURN VALUE
           The strtol() function returns the result of the conversion, unless the value would underflow or over‐
           flow.  If an underflow occurs, strtol() returns LONG_MIN.  If an overflow  occurs,  strtol()  returns
           LONG_MAX.   In  both  cases,  errno  is  set to ERANGE.  Precisely the same holds for strtoll() (with
           LLONG_MIN and LLONG_MAX instead of LONG_MIN and LONG_MAX).
    
    ERRORS
           EINVAL (not in C99) The given base contains an unsupported value.
    
           ERANGE The resulting value was out of range.
    
           The implementation may also set errno to EINVAL in case no conversion was performed (no digits  seen,
           and 0 returned).
    
    ATTRIBUTES
           For an explanation of the terms used in this section, see attributes(7).
    
           ┌──────────────────────────────┬───────────────┬────────────────┐
           │Interface                     │ Attribute     │ Value          │
           ├──────────────────────────────┼───────────────┼────────────────┤
           │strtol(), strtoll(), strtoq() │ Thread safety │ MT-Safe locale │
           └──────────────────────────────┴───────────────┴────────────────┘
    CONFORMING TO
           strtol(): POSIX.1-2001, POSIX.1-2008, C89, C99 SVr4, 4.3BSD.
    
           strtoll(): POSIX.1-2001, POSIX.1-2008, C99.
    
    
    NOTES
           Since  strtol()  can  legitimately  return  0, LONG_MAX, or LONG_MIN (LLONG_MAX or LLONG_MIN for str‐
           toll()) on both success and failure, the calling program should set errno to 0 before the  call,  and
           then determine if an error occurred by checking whether errno has a nonzero value after the call.
    
           According  to  POSIX.1,  in locales other than the "C" and "POSIX", these functions may accept other,
           implementation-defined numeric strings.
    
           BSD also has
    
               quad_t strtoq(const char *nptr, char **endptr, int base);
    
           with completely analogous definition.  Depending on the wordsize of the  current  architecture,  this
           may be equivalent to strtoll() or to strtol().
    
    EXAMPLE
           The  program shown below demonstrates the use of strtol().  The first command-line argument specifies
           a string from which strtol() should parse a number.  The second  (optional)  argument  specifies  the
           base  to  be  used  for the conversion.  (This argument is converted to numeric form using atoi(3), a
           function that performs no error checking and has a simpler interface than strtol().)   Some  examples
           of the results produced by this program are the following:
    
               $ ./a.out 123
               strtol() returned 123
               $ ./a.out '    123'
               strtol() returned 123
               $ ./a.out 123abc
               strtol() returned 123
               Further characters after number: abc
               $ ./a.out 123abc 55
               strtol: Invalid argument
               $ ./a.out ''
               No digits were found
               $ ./a.out 4000000000
               strtol: Numerical result out of range
    
       Program source
    
           #include <stdlib.h>
           #include <limits.h>
           #include <stdio.h>
           #include <errno.h>
    
           int
           main(int argc, char *argv[])
           {
               int base;
               char *endptr, *str;
               long val;
    
               if (argc < 2) {
                   fprintf(stderr, "Usage: %s str [base]\n", argv[0]);
                   exit(EXIT_FAILURE);
               }
    
               str = argv[1];
               base = (argc > 2) ? atoi(argv[2]) : 10;
    
               errno = 0;    /* To distinguish success/failure after call */
               val = strtol(str, &endptr, base);
    
               /* Check for various possible errors */
    
               if ((errno == ERANGE && (val == LONG_MAX || val == LONG_MIN))
                       || (errno != 0 && val == 0)) {
                   perror("strtol");
                   exit(EXIT_FAILURE);
               }
    
               if (endptr == str) {
                   fprintf(stderr, "No digits were found\n");
                  exit(EXIT_FAILURE);
               }
    
               /* If we got here, strtol() successfully parsed a number */
    
               printf("strtol() returned %ld\n", val);
    
               if (*endptr != '\0')        /* Not necessarily an error... */
                   printf("Further characters after number: %s\n", endptr);
    
               exit(EXIT_SUCCESS);
           }
    
    SEE ALSO
           atof(3), atoi(3), atol(3), strtod(3), strtoul(3)
    
    COLOPHON
           This  page  is  part  of  release 4.04 of the Linux man-pages project.  A description of the project,
           information  about  reporting  bugs,  and  the  latest  version  of  this  page,  can  be  found   at
           http://www.kernel.org/doc/man-pages/.
    
    GNU                                              2015-08-08                                        STRTOL(3)
    

     

    展开全文
  • strtol介绍

    2014-05-07 15:05:24
    详细介绍strtol函数的使用方法和案例介绍。 
  • C语言strtol

    2021-08-06 09:44:50
    long int strtol (const char* str, char** endptr, int base); 注意第二个形参是二级指针,如果定义char *stop,那么要出入&stop #include <stdio.h> #include <stdlib.h> #include <errno.h&...

    函数原型:

    long int strtol (const char* str, char** endptr, int base);
    注意第二个形参是二级指针,如果定义char *stop,那么要出入&stop

    #include <stdio.h>
    #include <stdlib.h>
    #include <errno.h>
    #include <string.h>
    
    int main(void)
    {
        const char *str = "10 200000000000000000000000000000 30 -40 junk";
        const char *begin = str;
        printf("Parsing '%s', begin addr = %p:\n\n", begin, begin);
        char *stop;
        long i = strtol(begin, &stop, 10);
        while (begin != stop)
        {
            printf("begin: %p\n", begin);
            printf("stop: %p\n", stop);
            printf("'%.*s' -> %ld\n", (int)(stop-begin), begin, i);
    
            char *message = strerror(errno);
            if (message != NULL) {
                printf("%s\n\n", message);
                errno = 0;
            }
    
            begin = stop;
            i = strtol(begin, &stop, 10);
        }
    }
    

    参考http://www.verydoc.net/c/00000863.html

    另一种用法,判断'\0'

    int ParseData(char *str, int array[])
    {
        if (str == NULL) {
            return 0;
        }
    
        char *start = NULL;
        char *stop = NULL;
        start = str;
        int count = 0;
    
        while (1) {
            int num = strtol(start, &stop, 10);
            array[count++] = num;
            if (stop[0] == '\0') {
                start = NULL;
                stop = NULL;
                break;
            }
            start = stop + 1;
        }
        return count;
    }

    展开全文
  • strtol函数

    千次阅读 2017-10-08 15:40:11
    本文将介绍strtol函数,参考linux programmer’s manual,如有任何疑问请评论指出. C 库函数 long int strtol(const char nptr, char endptr, int base) 把参数 str 所指向的字符串根据给定的 base 转换为一个长整数...

    本文将介绍strtol函数,参考linux programmer’s manual,如有任何疑问请评论指出.
    C 库函数 long int strtol(const char nptr, char endptr, int base) 把参数 str 所指向的字符串根据给定的 base 转换为一个长整数(类型为 long int 型),base 必须介于 2 和 36(包含)之间,或者是特殊值 0。

    声明

    下面是 strtol() 函数的声明。
    long int strtol(const char *nptr, char **endptr, int base);
    参数
    nptr – 要转换为长整数的字符串。
    endptr – 对类型为 char* 的对象的引用,其值由函数设置为 str 中数值后的下一个字符。
    base – 基数,必须介于 2 和 36(包含)之间,或者是特殊值 0。
    返回值
    该函数返回转换后的长整数,如果没有执行有效的转换,则返回一个零值。
    如果endptr不等于NULL,strtol()函数中*endptr保存着第一个非法字符的地址,如果没有待转换的字符*endptr保存着原始值。
    strtoll()函数与strtol()函数唯一的不同是返回值是long long integer.
    关于示例代码的讲解:
    atoi()函数将字符串转换为整型.
    perror(char *string):string为要输出的错误信息。
    perror()用来将上一个函数发生错误的原因输出到标准错误(stderr)。参数string所指的字符串会先打印出,后面再加上错误原因字符串,此错误原因依照全局变量errno 的值来决定要输出的字符串。


          #include <stdlib.h>
           #include <limits.h>
           #include <stdio.h>
           #include <errno.h>
    
           int
           main(int argc, char *argv[])
           {
               int base;
               char *endptr, *str;
               long val;
    
               if (argc < 2) {
                   fprintf(stderr, "Usage: %s str [base]\n", argv[0]);
                   exit(EXIT_FAILURE);
               }
    
               str = argv[1];
               base = (argc > 2) ? atoi(argv[2]) : 10;
    
               errno = 0;    /* To distinguish success/failure after call */
               val = strtol(str, &endptr, base);
    
               /* Check for various possible errors */
    
               if ((errno == ERANGE && (val == LONG_MAX || val == LONG_MIN))
                       || (errno != 0 && val == 0)) {
                   perror("strtol");
                   exit(EXIT_FAILURE);
               }
    
             if (endptr == str) {
                   fprintf(stderr, "No digits were found\n");
                   exit(EXIT_FAILURE);
               }
    
               /* If we got here, strtol() successfully parsed a number */
    
               printf("strtol() returned %ld\n", val);
    
               if (*endptr != '\0')        /* Not necessarily an error... */
                   printf("Further characters after number: %s\n", endptr);
    
               exit(EXIT_SUCCESS);
           }
    
    展开全文
  • strtol全面解析

    2021-04-14 11:31:44
    基本简介:C 库函数 long int strtol(const char *str, char **endptr, int base) 把参数 str 所指向的字符串根据给定的 base 转换为一个长整数(类型为 long int 型),base 必须介于 2 和 36(包含)之间,或者是...

    基本简介:C 库函数 long int strtol(const char *str, char **endptr, int base) 把参数 str 所指向的字符串根据给定的 base 转换为一个长整数(类型为 long int 型),base 必须介于 2 和 36(包含)之间,或者是特殊值 0。

    详细解释:long int strtol (const char *str, char **endptr, int base)
    strtol()会将str指向的字符串,根据参数base,按权转化为long int, 然后返回这个值。
    这里从转换后的返回值都是十进制的,其中的base参数指的是以什么进制解析str所指向的字符串

    参数base的范围为2~36,和0;它决定了字符串以被转换为整数的权值。
    可以被转换的合法字符依据base而定,举例来说,当base为2时,合法字符为‘0’,‘1’;base为8时,合法字符为‘0’,‘1’,……‘7’;base为10时,合法字符为‘0’,‘1’,……‘9’;base 为16时,合法字符为‘0’,‘1’,……‘9’,‘a’,……‘f’;base为24时,合法字符为‘0’,……‘9’,‘a’,……‘n’,base为36时,合法字符为‘0’,……‘9’,‘a’,……‘z’;等等。其中,不区分大小写,比如,‘A’和‘a’会都会被转化为10。

    当字符合法时,‘0’,……‘9’依次被转换为十进制的0~9,‘a’,……‘z’一次北转换为十进制的10~35。
    这里的合法是指比如base等于16,则0,1,…9,a,…,f为合法字符,其他都为非法字符

    strtol检测到第一个非法字符时,立即停止检测,其后的所有字符都会被当作非法字符处理。合法字符串会被转换为long int, 作为函数的返回值。非法字符串,即从第一个非法字符的地址,被赋给endptr。即endptr为非法字符串。
    下面可以看几个示例:
    示例1

    int main()
    {
        char buffer[20]="10379cend$3";
        char *stop;
        printf("%d\n",strtol(buffer, &stop, 2));      //2
        cout << stop << endl;                             //379cend$3
        return 0;
    }  
    

    输出结果:
    2
    379cend$3

    示例2

    int main()
    {
        char buffer[20]="10379cend$3";
        char *stop;
        printf("%d\n",strtol(buffer, &stop, 10));      //10379
        cout << stop << endl;                               //cend$3
        return 0;
    }  
    

    输出结果:
    10379
    cend$3

    示例3

    int main()
    {
        char buffer[20]="10379cend$3";
        char *stop;
        printf("%d\n",strtol(buffer, &stop, 16));   //17005006
        cout << stop << endl;							  //nd$3
        return 0;
    }  
    

    输出结果:
    17005006
    nd$3

    以上三个示例说明了base的作用。

    最后再补充一下关于endptr为NULL、0、nullptr的情况,据我所参考的博客,大多数的说法是“多数情况下,endptr设置为NULL, 即不返回非法字符串。”,我没有明白这句话的意思,但是根据我的实验代码如下可说明具体的用法(以下base均为10):
    示例endptr = 0

    int main()
    {
        char buffer[20]="10379cend$3";
        char *stop = 0;
        printf("%d\n",strtol(buffer, &stop, 10)); //10379
        cout << stop << endl;                     //cend$3
        return 0;
    }   
    

    输出结果:
    10379
    cend$3

    示例endptr = NULL

    int main()
    {
        char buffer[20]="10379cend$3";
        char *stop = NULL;
        printf("%d\n",strtol(buffer, &stop, 10)); //10379
        cout << stop << endl;                     //cend$3
        return 0;
    }   
    

    输出结果:
    10379
    cend$3

    示例endptr = nullptr

    int main()
    {
        char buffer[20]="10379cend$3";
        char *stop = nullptr;
        printf("%d\n",strtol(buffer, &stop, 10)); //10379
        cout << stop << endl;                     //cend$3
        return 0;
    }   
    

    输出结果:
    10379
    cend$3

    以上可知,当endptr被设置为0, NULL,nullptr时,所起的作用与其他一样。
    关于0、nullptr、NULL区别见我后续文章。

    拓展示例

    int main()
    {
        const char *ch = "5500";
        char *endptr = 0;
       // const char *ch1 = "";
       // if (*ch1 == 0)
       //   cout << true << endl;
        auto a = strtol(ch, &endptr, 10); //a = 5500
        cout << a << endl;
        cout << endptr << endl;          //此处endptr = "",因为5500后为空,没有非法字符串
        if (*endptr == 0)                //endptr = "", 所以*endptr = 0
            cout << "true" << endl;
        system("pause");
        return 0;
    }   
    

    参考链接1https://www.cnblogs.com/lzjsky/archive/2011/01/05/1926369.html
    参考链接2https://www.runoob.com/cprogramming/c-function-strtol.html

    展开全文
  • strtol详解

    2018-01-30 08:16:00
    今天,在review 一些代码的时候,看到了strtol()这个函数,由于以前使用它的时候,还没有深刻的了解,这次,我决定探个究竟。 网上关于这个函数的资料大都来源于同份资料,linux库函数,讲的不够细...
  • strtol函数用法

    千次阅读 2018-10-12 09:02:07
    之前想用C写MD5函数用法,中间设计大量进制转换的内容,于是就查到了strtol这个函数 但是发现之前对其认识上有一些偏颇,所以把它的用法记录下来 strtol是一个C语言函数,作用就是将一个字符串转换为长整型long,其...
  • strtol 笔记

    2013-12-08 09:35:00
    strtol 是将字符串转换为long int的一个函数 strtol(const char* nptr, char **endptr, int base) nptr:待转换的str endptr:返回非法字符串,默认为null base: 转换基数 【以下来源】 strtol()函数检测到第...
  • strtol简介

    2013-06-02 21:06:00
    strtol简介 long int strtol(const char *nptr, char **endptr, int base) strtol()会将nptr指向的字符串,根据参数base,按权转化为long int, 然后返回这个值。 参数base的范围为2~36,和0;它决定了字符串以被...
  • c++strtol()

    千次阅读 2019-09-18 18:28:08
    strtol()详解 long int strtol(const char *nptr, char **endptr, int base) strtol()会将nptr指向的字符串,根据参数base,按权转化为long int,然后返回这个值。 参数base的范围为2-36和0,他决定了字符串以被...
  • strtol 函数用法

    2017-12-15 10:46:00
    strtol是一个C语言函数,作用就是将一个字符串转换为长整型long,其函数原型为: long int strtol (const char* str, char** endptr, int base); 下面我们来看下每个参数的意义: str是要转换的字符 enptr是指向第一...
  • strtol 英文

    2013-06-30 16:05:25
    long int strtol (const char* str, char** endptr, int base); Convert string to long integer Parses the C-string str interpreting its content as an integral number of the specified base, which ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 9,881
精华内容 3,952
关键字:

strtol