002-strtoul函数(输入字符串转换为数字)

================================================================================

1.函数原型

unsigned long int strtoul(const char *nptr, char **endptr, int base);
unsigned long long int strtoull(const char *nptr, char **endptr,int base);
    1、参数nptr:字符串的起始地址。

    2、参数endptr: 返回字符串有效数字的结尾地址。如 123456fe789 则返回数字f的地址。

    3、参数base:转化基数。   
        参数 base 范围从236,或0。
        参数 base 代表 nptr 采用的进制方式,如 base 值为10 则采用 10 进制,若 base 值为16 则采用16 进制数等。

2.功能描述

convert a string to an unsigned long integer(把输入的字符串转换成数字).
strtoul() 会扫描参数nptr 字符串,跳过前面的空白字符(例如空格,tab缩进等,可以通过 isspace() 函数来检测),直到遇上数字或正负符号才开始做转换,再遇到非数字或字符串结束时(’\0’)结束转换,并将结果返回。

3.所需头文件

  #include <stdlib.h>

4.注意两点

1、当 base 的值为 0 时,默认采用 10 进制转换,但如果遇到 '0x' / '0X' 前置字符则会使用 16 进制转换,
遇到 '0' 前置字符则会使用 8 进制转换。

2、若 endptr 不为NULL,则会将遇到的不符合条件而终止的字符指针由 endptr 传回;若 endptr 为 NULL,
则表示该参数无效,或不使用该参数。本文最后的范例没有展示 endptr 参数的使用,
你可以参考 strtol() 函数的范例来更加直观地了解 endptr 参数。

5.示例

实例一

输入字符串,base 的值为2,二进制转换。

#include <stdio.h> 
#include <stdlib.h> 
int main () 
{   
	char buffer [256];   
	unsigned long ul; 
    char * endptr;
    while(1)
	{
	   printf ("Enter an unsigned number: ");  
	   fgets (buffer, 256, stdin);   
	   ul = strtoul (buffer, &endptr, 2);   
       printf ("Value entered: %lu ,the address of the first invalid character is %d ,invalid character=%s\n", ul,endptr,endptr);   
	   system("pause"); 
	}
	return 0; 
} 

测试结果:
在这里插入图片描述
实例二:
输入字符串,base 的值为10,十进制转换。

#include <stdio.h> 
#include <stdlib.h> 
int main () 
{   
	char buffer [256];   
	unsigned long ul; 
    char * endptr;
    while(1)
	{
	   printf ("Enter an unsigned number: ");  
	   fgets (buffer, 256, stdin);   
	   ul = strtoul (buffer, &endptr, 10);   
       printf ("Value entered: %lu ,the address of the first invalid character is %d ,invalid character=%s\n", ul,endptr,endptr);   
	   system("pause"); 
	}
	return 0; 
} 

测试结果:
在这里插入图片描述
实例三:
输入字符串,base 的值为0的特殊情况。
1、当 base 的值为 0 时,默认采用 10 进制转换,但如果遇到 ‘0x’ / ‘0X’ 前置字符则会使用 16 进制转换,遇到 ‘0’ 前置字符则会使用 8 进制转换。
2、若 endptr 不为NULL,则会将遇到的不符合条件而终止的字符指针由 endptr 传回;若 endptr 为 NULL,则表示该参数无效,或不使用该参数。本文最后的范例没有展示 endptr 参数的使用,你可以参考 strtol() 函数的范例来更加直观地了解 endptr 参数。

#include <stdio.h> 
#include <stdlib.h> 
int main () 
{   
	char buffer [256];   
	unsigned long ul; 
    char * endptr;
    while(1)
	{
	   printf ("Enter an unsigned number: ");  
	   fgets (buffer, 256, stdin);   
	   ul = strtoul (buffer, &endptr, 0);   
       printf ("Value entered: %lu ,the address of the first invalid character is %d ,invalid character=%s\n", ul,endptr,endptr);   
	   system("pause"); 
	}
	return 0; 
} 

测试结果:
在这里插入图片描述

————————————————
版权声明:本文为CSDN博主「海月汐辰」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_37858386/article/details/78458401

6.补充说明

strtol, strtoll, strtoul, strtoull
convert a string to a (signed, unsigned ) long integer string
声明:
#include<stdlib.h> ( 这个是C标准库,与linux无关。这套函数是通用的。)
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);
说明,第一个参数 nptr是要转化的字符串。第三个参数base说明nptr的进制。base 取值范围 0,2-36
这几个函数会忽略nptr前面的空格( ’ ‘, ‘\t’, ‘\n’ ‘\f’, ‘\v’ ‘\r’ ,由isspace判定为真的字符)
while (*nptr && isspace ( *nptr ) ) ++ nptr;
然后遇到非合法字符结束;
base = 2; 合法字符为0, 1
base = 3; 合法字符为0,1, 2

base = 11; 合法字符为0,1,…,9,a(A)

base = 36;合法字符为0, 1, …,9,a(A),…,z(Z)。
字符 a-z,是忽略大小写的,混着来也行,例如 strtol(“aA”, NULL, 11)依然能得到正确的结果。
函数的第二个参数endptr可以为空,如果不为空,则 endptr 保存函数结束前的那个非合法字符的地址。
如果没有合法字符,则 *endptr = nptr,函数返回0.
例如:
1.
char *endptr;
char nptr[]=“123abc”;
int ret = strtol(nptr, &endptr, 10 );
由于10进制里没有“数字”a,所以扫描到a,结束。
这样 ret = 123;
endptr = &nptr[3]; ( printf("%s", endptr);将得到字符串 abc )
2.
char nptr[]=" \n\t abc";
int ret = strtol(nptr, &endptr, 10 );
由于函数会忽略nptr前面的空格(’ ', ‘\n’…),所以,从字符a开始扫描,但是遇见的“第一个”即是不合法字符。
所以函数结束。 ret=0; endptr = nptr;
以下的讨论,会认为 nptr 前面没有空格,
即执行过类似于while (*nptr &&isspace ( *nptr ) ) ++ nptr;
如果base 为0.则分3种情况:
如果nptr 以0x(零x)开头,则把nptr当成16进制处理。
如果npstr以0(零)开头,则把nptr当成8进制处理。
否则,把nptr当成10进制。
对于函数执行错误,如传了一个非合法base,则errno会设置相关值

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值