在项目开发时,字符串跟整形的转换是普遍需求的一个功能,在c/c++中常用的几个函数包括strtol strtoll strtoul strtoull。
 目前我们的项目里面进行转换的时候都是直接调用,对被转换的字符串是否有效,转换是否成功都没有一个基本的判断,一直想研究下,今天正好有空,仔细看了下linux man page中这几个函数的详细解释.
声明

#include <stdlib.h>
 long int strtol(const char *nptr, char **endptr, int base);
 long long int strtoll(const char *nptr, char **endptr, int base);
 unsigned long int strtoul(const char *nptr, char **endptr, int base);
 unsigned long long int strtoull(const char *nptr, char **endptr, int base);
功能:
 这一组函数根据指定的进制base(2-36或者0,为0时根据字符串自动推断转换的进制)将nptr指向的字符串转换为对应的整形。
 nptr可以以多个空格(isspace函数返回true的字符)开头,接着也可以有'+'或者'-'正负符号标记。如果base是16或者是0,接下来可以有“0x”的前缀,此时字符串将会当作16进制数字进行转换;如果接下的字符是‘0’,将会被当作8进制进行转换;除此之外都会被当作默认的十进制。
 除了前缀之外其余的字符串将会被转换为对应的整形,并且会在给定进制base的第一个非有效数字字符终止(对于10以上的进制,'A'表示10,‘11’表示B,以此类推,'Z'表示35)。
 如果endptr是非空,则endptr将会保存nptr中第一个指定进制base的无效字符串的地址;如果不存在有效字符串,则endptr会保存原始nptr的地址,并且返回0。通常情况,如果*nptr值不为'\0',返回时**endptr值为'\0',整个nptr字符串都是无效的。
返回值:
 返回对应的转换结果。对于结果溢出的现象,分别返回对应的整形的最大值,或者最小值(LONG_MAX LONG_MIN LLONG_MAX LLONG_MIN ULONG_MAX ULLONG_MAX ULLONG_MAX),此时errno被置为ERANGE.对于转换无符号整形的几个函数,如果字符串有前置的减号标记,转换的结果仍会被转换无无符号整形。
ERRORS:
 EINVAL base值不支持
 ERANGE 结果溢出
 有的实现在转换没有进行时(没有数字字符输入,返回0),也可能将errno设置为EINVAL。
注意:
 因为这一组函数,在成功或者失败的情况下,都有可能合理的返回0或者溢出极值,调用者在使用之前应该将errno设置为0,并且在调用之后检查errno的值来确定是否有错误发生。
 按照上面的文档对几个函数进行封装,便于在实践中使用,具体如下:
封装:        
bool stringToI32(const std::string &str, int32_t  &val)
{
    long temp_val = 0;
    bool isOK = stringToL(str, temp_val);
    val = temp_val;
    return isOK && (temp_val >= -0x7fffffff && temp_val <= 0x7fffffff/*32bit整形的有效范围*/);
}
 
bool stringToU32(const std::string &str, uint32_t  &val)
{
    unsigned long temp_val = 0;
    bool isOK = stringToUL(str, temp_val);
    val = temp_val;
    return isOK && (temp_val <= 0xffffffff/*32bit无符号整形的有效范围*/);
}
 
bool stringToI64(const std::string &str, int64_t  &val)
{
    long long temp_val = 0;
    bool isOK = stringToLL(str, temp_val);
    val = temp_val;
    return isOK && (temp_val >= -0x7fffffffffffffff && temp_val <= 0x7fffffffffffffff/*64bit整形的有效范围*/);
}
 
bool stringToU64(const std::string &str, uint64_t  &val)
{
    unsigned long long temp_val = 0;
    bool isOK = stringToULL(str, temp_val);
    val = temp_val;
    return isOK && (temp_val <= 0xffffffffffffffff/*64bit无符号整形的有效范围*/);
}
 
bool stringToL(const std::string &str, long  &val)
{
    bool isOK = false;
    const char *nptr = str.c_str();
    char *endptr = NULL;
    errno = 0;
    val = strtol(nptr, &endptr, 10);
    //error ocur
    if ((errno == ERANGE && (val == LONG_MAX || val == LONG_MIN))
        || (errno != 0 && val == 0))
    {
 
    }
    //no digit find
    else if (endptr == nptr)
    {
 
    }
    else if (*endptr != '\0')
    {
        // printf("Further characters after number: %s\n", endptr);
    }
    else
    {
        isOK = true;
    }
 
    return isOK;
}
 
bool stringToLL(const std::string &str, long long &val)
{
    bool isOK = false;
    const char *nptr = str.c_str();
    char *endptr = NULL;
    errno = 0;
    val = strtoll(nptr, &endptr, 10);
    //error ocur
    if ((errno == ERANGE && (val == LLONG_MAX || val == LLONG_MIN))
        || (errno != 0 && val == 0))
    {
 
    }
    //no digit find
    else if (endptr == nptr)
    {
 
    }
    else if (*endptr != '\0')
    {
        // printf("Further characters after number: %s\n", endptr);
    }
    else
    {
        isOK = true;
    }
 
    return isOK;
}
 
bool stringToUL(const std::string &str, unsigned long  &val)
{
    bool isOK = false;
    const char *nptr = str.c_str();
    char *endptr = NULL;
    errno = 0;
    val = strtoul(nptr, &endptr, 10);
    //error ocur
    if ((errno == ERANGE && (val == ULONG_MAX))
        || (errno != 0 && val == 0))
    {
 
    }
    //no digit find
    else if (endptr == nptr)
    {
 
    }
    else if (*endptr != '\0')
    {
        // printf("Further characters after number: %s\n", endptr);
    }
    else
    {
        isOK = true;
    }
 
    return isOK;
}
 
bool stringToULL(const std::string &str, unsigned long long &val)
{
    bool isOK = false;
    const char *nptr = str.c_str();
    char *endptr = NULL;
    errno = 0;
    val = strtoull(nptr, &endptr, 10);
    //error ocur
    if ((errno == ERANGE && (val == ULLONG_MAX))
        || (errno != 0 && val == 0))
    {
 
    }
    //no digit find
    else if (endptr == nptr)
    {
 
    }
    else if (*endptr != '\0')
    {
        // printf("Further characters after number: %s\n", endptr);
    }
    else
    {
        isOK = true;
    }
 
    return isOK;
}

c/c++函数 -strtol strtoll strtoul strtoull解读相关推荐

  1. c/c++函数 -strtol strtoll strtoul strtoull 使用注意项cc

    说明 在项目开发时,字符串跟整形的转换是普遍需求的一个功能,在c/c++中常用的几个函数包括 strtol strtoll strtoul strtoull. 目前我们的项目里面进行转换的时候都是直接 ...

  2. strtol strtoll strtoul strtoull应用

    在项目开发时,字符串跟整形的转换是普遍需求的一个功能,在c/c++中常用的几个函数包括 strtol strtoll strtoul strtoull. 目前我们的项目里面进行转换的时候都是直接调用, ...

  3. strtol,strtoll,strtoul, strtoull字符串转化成数字

    名字: strtol, strtoll, strtoul, strtoull convert a string to a (signed, unsigned ) long integer string ...

  4. 函数atof,atoi,atol,strtod,strtol,strtoul 描述

    函数atof,atoi,atol,strtod,strtol,strtoul atof(将字串转换成浮点型数)  相关函数 atoi,atol,strtod,strtol,strtoul 表头文件 # ...

  5. 11-字符串转换函数(strtod、strtol、strtoul)

    字符串转换函数包含在通用工具函数库<strlib.h>中 一:函数strtod(string to double) double strtod(const char *nPtr,char ...

  6. 函数atof,atoi,atol,strtod,strtol,strtoul

    在做项目过程中经常需要把字符串转换成整形数,这时候就需要用到下面几种函数:函数atof,atoi,atol,strtod,strtol,strtoul 函数说明是:该函数会扫描参数中的字符串,跳过前面 ...

  7. linux c 数字字符串互转 相关函数 atoi、atof、atol、atrtod、strtol、strtoul

    一.atoi函数(将字符串转换成整型数) 定义函数 int atoi(const  char *  nptr); 函数说明 atoi()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负 ...

  8. toi,atol,strtod,strtol,strtoul实现类型转换

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明 http://ivanvic.blogbus.com/logs/1920125.html atof(将字符串转换成浮点型数) 相关函数 ...

  9. atoi,atol,strtod,strtol,strtoul实现类型转换

    一.atoi C语言库函数名: atoi 功 能: 把字符串转换成整型数. 名字来源:array to integer 的缩写. 原型: int atoi(const char *nptr); 函数说 ...

最新文章

  1. 基于SpringBoot的乡村医生诊疗系统的设计与实现
  2. python3练习题:1-10
  3. VTK:深度优先搜索动画用法实战
  4. 多功能复合机基于用户认证功能的实现过程详解
  5. sap fiori导出列表到excel_介绍一种Fiori标准应用的增强方式
  6. 互联网日报 | 5月3日 星期一 | 京东物流通过港交所上市聆讯;理想汽车累计交付破5万辆;拼多多年活跃商户达860万
  7. Typedef的一些用法总结
  8. 深度Linux对比比,深度Linux10.06 beta1与ylmfOS 3.0简单对比
  9. EMNLP'21中预训练模型最新研究进展
  10. 数学逻辑习题集(2)
  11. 计算机专业毕设论文题目大全(二)
  12. zcu111解决DP时钟报错问题
  13. Taro项目中设置了设计稿尺寸
  14. SSH远程控制计算机
  15. O0 O1 O2 O3优化原理
  16. 读书笔记 - 《移山之道:VSTS软件开发指南》中的软件测试介绍
  17. 搜索关键词优化 助力全网霸屏营销
  18. 什么是信贷风险控制?
  19. XTPToolKitPro常用功能
  20. Linux快捷键大全

热门文章

  1. c语言noj除法,快速排序~C语言~NOJ1064
  2. Saving Files
  3. FF 新鲜事 -- FlashHelperService.exe
  4. 2022最新全民养狗/宠物养成APP运营源码+区块链系统
  5. 商品定时上下架的解决方案
  6. 下载 Microsoft SQL Server JDBC 驱动程序
  7. css多个伪元素,CSS(一)伪元素的巧用
  8. 自动驾驶算法详解(3): LQR算法进行轨迹跟踪,lqr_speed_steering_control( )的python实现
  9. HackTheBox-Reg
  10. 【蓝桥OJ—C语言】高斯日记、马虎的算式、第39级台阶