atoi() 和strtol区别和用法

 

1、函数原型

unsigned long strtoul(const char *nptr,char **endptr,int base )
#define strtoul  simple_strtoul
#define TOLOWER(x) ((x) | 0x20)

static unsigned int simple_guess_base(const char *cp)  
{  
    if (cp[0] == '0') {  
        if (TOLOWER(cp[1]) == 'x' && isxdigit(cp[2]))  
            return 16;  
        else  
            return 8;  
    } else {  
        return 10;  
    }  
}  
  
unsigned long simple_strtoul(const char *cp, char **endp, unsigned int base)  
{  
    unsigned long result = 0;  
  
    if (!base)  
        base = simple_guess_base(cp);  
  
    if (base == 16 && cp[0] == '0' && TOLOWER(cp[1]) == 'x')  
        cp += 2;  
  
    while (isxdigit(*cp)) {  
        unsigned int value;  
  
        value = isdigit(*cp) ? *cp - '0' : TOLOWER(*cp) - 'a' + 10;  
        if (value >= base)  
            break;  
        result = result * base + value;  
        cp++;  
    }  
  
    if (endp)  
        *endp = (char *)cp;  
    return result;  
}
int atoi(const  char *  nptr);
函数说明 atoi()会扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串
结束时('\0')才结束转换,并将结果返回。函数说明 atoi()会扫描参返回值:返回转换后的整型数。
附加说明 atoi()与使用strtol(nptr,(char**)NULL,10);结果相同。

static int atoi(const char* str)
{
    int result = 0;
    int sign = 0;
    if(str != NULL)
    {
        return -1;
    }
    /*遍历直到遇到数字字符*/
    while (*str==' ' || *str=='\t' || *str=='\n')
    {
       ++str; 
    }
    /*处理正负数值*/
    if (*str=='-')
    {
        sign = 1;
        ++str;
    }
    else if (*str=='+')
    {
        ++str;
    }

    /*处理数值*/
    while (*str>='0' && *str<='9')
    {
        result = result*10 + *str - '0';
        ++str;
    }

    // return result
    if (sign==1)
    {
       return -result; 
    }   
    else
    {
        return result;
    }
       
}
2、区别
   --> atoi()只能转换10进制数值,而不能转换十六进制和八进制;atoi的返回值无法区分是正常的返回还是 
        错误的返回,而strtol可以根据返回值判断是否错误返回。
   -->strtol参数base 可以为2、10、16进制,base为0时表示函数自动检测进制类型,功能比atoi()强大。
3、用法


int main(int argc, char **argv)
{

	rw_register_attr rw_reg_info;
	memset(&rw_reg_info, 0x0, sizeof(rw_register_attr));
	rw_reg_info.pos = 0;
	rw_reg_info.size = 8;
	if(argc <5)
	{
		printf("usage: nvp6324 <flag 0:read,1:write> <dev> <bank> <addr> <val> <pos> <size> \n");
		printf("sample: nvp6324 0 0 0 0x08 \n");
		printf("sample: nvp6324 1 0 0 0x08 1\n");
		return 0;
	}
	rw_reg_info.flag = strtoul(argv[1], NULL, 0);
	if(rw_reg_info.flag == 0 && argc == 5)
	{
		
		rw_reg_info.dev = strtoul(argv[2], NULL, 0);
		rw_reg_info.bank = strtoul(argv[3], NULL, 0);
		rw_reg_info.addr = strtoul(argv[4], NULL, 0);
	}
	else if(rw_reg_info.flag == 1 && argc == 6)
	{
		rw_reg_info.dev = strtoul(argv[2], NULL, 0);
		rw_reg_info.bank = strtoul(argv[3], NULL, 0);
		rw_reg_info.addr = strtoul(argv[4], NULL, 0);
		rw_reg_info.val = strtoul(argv[5], NULL, 0);
		
	}
	else if(rw_reg_info.flag == 1 && argc == 8)
	{
		rw_reg_info.dev = strtoul(argv[2], NULL, 0);
		rw_reg_info.bank = strtoul(argv[3], NULL, 0);
		rw_reg_info.addr = strtoul(argv[4], NULL, 0);
		rw_reg_info.val = strtoul(argv[5], NULL, 0);
		rw_reg_info.pos = strtoul(argv[6], NULL, 0);;
		rw_reg_info.size = strtoul(argv[7], NULL, 0);;
	}

	int m_fd_jaguar1 = -1;
	if(m_fd_jaguar1 < 0)
	{
		m_fd_jaguar1 = open(NVP6324_DEV_NODE, O_RDWR | O_NOCTTY| O_NONBLOCK);
		if (m_fd_jaguar1 < 0) {
			printf("nextchip dev open failed\n");
			return -1; 
		}
	}

	ioctl(m_fd_jaguar1, IOC_RW_REGISTER, &rw_reg_info);

	printf("[NVP6324]flag=%d dev=%d bank=%d addr=0x%x val=0x%x\n", rw_reg_info.flag, rw_reg_info.dev, rw_reg_info.bank, rw_reg_info.addr, rw_reg_info.val);

	close(m_fd_jaguar1);
	return 0;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值