c语言 strtol,strtol ( )【C语言库函数源代码】
【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语言库函数源代码】相关推荐
- C/C++ strtol 函数 - C语言零基础入门教程
目录 一.strtol 函数简介 二.strtol 函数函数实战 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : C/C++ 学习目录 >> C 语言基础入门 一.strtol 函数简 ...
- c语言hypot函数,hypot ( )【C语言库函数源代码】
[C语言库函数源代码] [本程序在Dev C++ 4.9.9.2 下编译通过] /* hypot函数对于给定的直角三角形的两个直角边, 求其斜边的长度. */ //一般的常规算法: doublemy_ ...
- pow ( )【C语言库函数源代码】
[C语言库函数源代码] [本程序在Dev C++ 4.9.9.2 下编译通过] double my_pow(double x, double y) { register double ret, val ...
- fabs ( )【C语言库函数源代码】
[C语言库函数源代码] [本程序在Dev C++ 4.9.9.2 下编译通过] float my_fabs01 (float fnumber) { float ret; __asm__ ( " ...
- c语言stricmp函数,stricmp ( )【C语言库函数源代码】
[C语言库函数源代码] [本程序在Dev C++ 4.9.9.2 下编译通过] /* _stricmp/_strcmpi perform a case-insensitive string compa ...
- c语言中strtod用法,strtod ( ) 和 atof ( )【C语言库函数源代码】
[C语言库函数源代码] [本程序在Dev C++ 4.9.9.2 下编译通过] /* 这个函数是把浮点数字符串转换为浮点数的函数. 函数将会跳过字符串中的空格字符和不是'+'.'-'.'.'. 数字的 ...
- c语言atof函数源代码,strtod ( ) 和 atof ( )【C语言库函数源代码】
[C语言库函数源代码] [本程序在Dev C++ 4.9.9.2 下编译通过] /* 这个函数是把浮点数字符串转换为浮点数的函数. 函数将会跳过字符串中的空格字符和不是'+'.'-'.'.'. 数字的 ...
- C语言下拉式菜单做出字体小,C语言下拉菜单设计-带源代码.ppt
<C语言下拉菜单设计-带源代码.ppt>由会员分享,可在线阅读,更多相关<C语言下拉菜单设计-带源代码.ppt(30页珍藏版)>请在人人文库网上搜索. 1.C语言下拉菜单程序设 ...
- c语言入门经典案例,c语言入门经典案例及飞源代码.doc
c语言入门经典案例及飞源代码 循环控制输出图案 [程序1]题目:输出9*9口诀.1.程序分析:分行与列考虑,共9行9列,i控制行,j控制列.2.程序源代码:#include "stdio.h ...
最新文章
- 面板服务器默认是什么系统,免费Linux服务器管理面板,你用的是哪个?
- 职场中如何与别人高效沟通?
- Centos7 上安装 mysql5.7
- 新手篇——学习网页开发需要多长时间就能找到工作
- 更新ubuntu软件源
- Rails安全导读【一】
- 如何将对象中的内容按照一定的顺序进行排序
- wegame饥荒一直登录中_经历网游和单机发行的左右摇摆后,Wegame决定“我全都要”...
- 又见 Lucky Number
- Samba使用大全(转
- Win11如何更新BIOS?
- 个人考研资料整理(更新一战后感想)
- 大华.dav视频格式转avi的一种办法
- dubbo的工作原理
- 如何学会计算机基础,学会这4点,你就能快速掌握电脑基本操作,摆脱新手的标签...
- android手机怎么投屏到电视盒子,手机钉钉怎么投屏到电视上
- 用电脑看电视的方法!!
- Faas,又一个未来?
- ping不通的常见原因和解决办法
- 探针台的配件也要第三方计量校准吗