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;
}