【C语言库函数源代码】

【本程序在Dev C++ 4.9.9.2 下编译通过】

/*

这个函数会将参数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返回。

*/

#include

#defineLONG_MAX2147483647L/*0x7FFFFFFF*/

#defineLONG_MIN(-2147483647L-1L) /*-0x80000000*/

intmy_strtol(const char *nptr, char

**endptr, int base)

{

const char *p = nptr;

unsigned long ret;

int ch;

unsigned long Overflow;

int sign = 0,

flag, LimitRemainder;

/*

跳过前面多余的空格,并判断正负符号。

如果base是0,允许以0x开头的十六进制数,

以0开头的8进制数。

如果base是16,则同时也允许以0x开头。

*/

do

{

ch = *p++;

} while

(isspace(ch));

if (ch ==

'-')

{

sign = 1;

ch = *p++;

}

else if (ch == '+')

ch = *p++;

if ((base ==

0 || base == 16) &&

ch == '0' && (*p == 'x' || *p ==

'X'))

{

ch = p[1];

p += 2;

base = 16;

}

if (base ==

0)

base = ch == '0' ? 8 : 10;

Overflow = sign ? -(unsigned

long)LONG_MIN : LONG_MAX;

LimitRemainder = Overflow % (unsigned long)base;

Overflow /= (unsigned

long)base;

for (ret = 0,

flag = 0;; ch = *p++)

{

/*把当前字符转换为相应运算中需要的值。*/

if

(isdigit(ch))

ch -= '0';

else if (isalpha(ch))

ch -= isupper(ch) ? 'A' - 10 : 'a' - 10;

else

break;

if (ch

>= base)

break;

/*如果产生溢出,则置标志位,以后不再做计算。*/

if (flag

< 0 || ret > Overflow || (ret == Overflow && ch >

LimitRemainder))

flag = -1;

else

{

flag = 1;

ret *= base;

ret += ch;

}

}

/*

如果溢出,则返回相应的Overflow的峰值。

没有溢出,如是符号位为负,则转换为负数。

*/

if (flag <

0)

ret = sign ? LONG_MIN : LONG_MAX;

else if (sign)

ret = -ret;

/*

如字符串不为空,则*endptr等于指向nptr结束

符的指针值;否则*endptr等于nptr的首地址。

*/

if (endptr !=

0)

*endptr = (char

*)(flag ?(p - 1) : nptr);

return ret;

}

intmain()

{

char * str =

"2147483647";

printf("%d\n",my_strtol(str, NULL,

0));

str = "-2147483648";

printf("%d\n",my_strtol(str, NULL,

0));

str = "0x7FFFFFFF";

printf("%d\n",my_strtol(str, NULL,

0));

str = "-0x80000000";

printf("%d\n",my_strtol(str, NULL,

0));

str = "0x7FFFFFFF";

printf("%d\n",my_strtol(str, NULL,

16));

str = "-0x80000000";

printf("%d\n",my_strtol(str, NULL,

16));

str = "017777777777";

printf("%d\n",my_strtol(str, NULL,

0));

str = "-020000000000";

printf("%d\n",my_strtol(str, NULL,

0));

system("pause");

return 0;

}

c语言 strtol,strtol ( )【C语言库函数源代码】相关推荐

  1. C/C++ strtol 函数 - C语言零基础入门教程

    目录 一.strtol 函数简介 二.strtol 函数函数实战 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 一.strtol 函数简 ...

  2. c语言hypot函数,hypot ( )【C语言库函数源代码】

    [C语言库函数源代码] [本程序在Dev C++ 4.9.9.2 下编译通过] /* hypot函数对于给定的直角三角形的两个直角边, 求其斜边的长度. */ //一般的常规算法: doublemy_ ...

  3. pow ( )【C语言库函数源代码】

    [C语言库函数源代码] [本程序在Dev C++ 4.9.9.2 下编译通过] double my_pow(double x, double y) { register double ret, val ...

  4. fabs ( )【C语言库函数源代码】

    [C语言库函数源代码] [本程序在Dev C++ 4.9.9.2 下编译通过] float my_fabs01 (float fnumber) { float ret; __asm__ ( " ...

  5. c语言stricmp函数,stricmp ( )【C语言库函数源代码】

    [C语言库函数源代码] [本程序在Dev C++ 4.9.9.2 下编译通过] /* _stricmp/_strcmpi perform a case-insensitive string compa ...

  6. c语言中strtod用法,strtod ( ) 和 atof ( )【C语言库函数源代码】

    [C语言库函数源代码] [本程序在Dev C++ 4.9.9.2 下编译通过] /* 这个函数是把浮点数字符串转换为浮点数的函数. 函数将会跳过字符串中的空格字符和不是'+'.'-'.'.'. 数字的 ...

  7. c语言atof函数源代码,strtod ( ) 和 atof ( )【C语言库函数源代码】

    [C语言库函数源代码] [本程序在Dev C++ 4.9.9.2 下编译通过] /* 这个函数是把浮点数字符串转换为浮点数的函数. 函数将会跳过字符串中的空格字符和不是'+'.'-'.'.'. 数字的 ...

  8. C语言下拉式菜单做出字体小,C语言下拉菜单设计-带源代码.ppt

    <C语言下拉菜单设计-带源代码.ppt>由会员分享,可在线阅读,更多相关<C语言下拉菜单设计-带源代码.ppt(30页珍藏版)>请在人人文库网上搜索. 1.C语言下拉菜单程序设 ...

  9. c语言入门经典案例,c语言入门经典案例及飞源代码.doc

    c语言入门经典案例及飞源代码 循环控制输出图案 [程序1]题目:输出9*9口诀.1.程序分析:分行与列考虑,共9行9列,i控制行,j控制列.2.程序源代码:#include "stdio.h ...

最新文章

  1. 面板服务器默认是什么系统,免费Linux服务器管理面板,你用的是哪个?
  2. 职场中如何与别人高效沟通?
  3. Centos7 上安装 mysql5.7
  4. 新手篇——学习网页开发需要多长时间就能找到工作
  5. 更新ubuntu软件源
  6. Rails安全导读【一】
  7. 如何将对象中的内容按照一定的顺序进行排序
  8. wegame饥荒一直登录中_经历网游和单机发行的左右摇摆后,Wegame决定“我全都要”...
  9. 又见 Lucky Number
  10. Samba使用大全(转
  11. Win11如何更新BIOS?
  12. 个人考研资料整理(更新一战后感想)
  13. 大华.dav视频格式转avi的一种办法
  14. dubbo的工作原理
  15. 如何学会计算机基础,学会这4点,你就能快速掌握电脑基本操作,摆脱新手的标签...
  16. android手机怎么投屏到电视盒子,手机钉钉怎么投屏到电视上
  17. 用电脑看电视的方法!!
  18. Faas,又一个未来?
  19. ping不通的常见原因和解决办法
  20. 探针台的配件也要第三方计量校准吗

热门文章

  1. C++题目:米诺斯的迷宫
  2. APP动效之美需内外兼修(转载自伯乐在线)
  3. “博哥来了”需要伯乐
  4. 【夯实Java基础】(三)史上最全集合框架归纳总结
  5. 为什么婚戒要带在无名指上(一个奇妙的生理现象)
  6. 【嵌入式】---- RCC
  7. 2022数据血缘关系详解
  8. 关于百度软件,百度软件真是垃圾的没法没法的
  9. Package missing in current channels
  10. oracle修改时间命令,linux 修改系统时间 oracle查询当前时间命令