sprintf()/simple_strtoul()

字符串格式化命令,主要功能是把格式化的数据写入某个字符串中。sprintf 是个变参函数,使用时经常出问题,而且只要出问题通常就是能导致程序崩溃的内存访问错误。无非就是那么几种情况,通常用眼睛再把出错的代码多看几眼就看出来了。

编辑本段函数简介

函数功能:

  把格式化的数据写入某个字符串缓冲区。

头文件:

  stdio.h

函数原型:

  int sprintf( char *buffer, const char *format, [ argument] … );

参数列表:

  buffer:char型指针,指向将要写入的字符串的缓冲区。
  format:char型指针,指向的内存里面存放的将要格式字符串。
  [argument]...:可选参数,可以是任何类型的数据。
  返回值:字符串长度(strlen)

#define FIRMWARE_DIRECTORY "/system/etc/firmware/rtl8723as/"
static const char *get_firmware_name()
{
static char firmware_file_name[PATCH] = {0};
sprintf(firmware_file_name,FIRMWARE_DIRECTORY"bt_fw");
return firmware_file_name;
}

字符串转换
Linux内核中提供的一些字符串转换函数:
lib/vsprintf.c
  1. unsigned long long simple_strtoull(const char *cp, char **endp, unsigned int base)  
  2. unsigned long simple_strtoul(const char *cp, char **endp, unsigned int base)  
  3. long simple_strtol(const char *cp, char **endp, unsigned int base)  
  4. long long simple_strtoll(const char *cp, char **endp, unsigned int base)  
  5. int strict_strtoul(const char *cp, unsigned int base, unsigned long *res)  
  6. int strict_strtol(const char *cp, unsigned int base, long *res)  
  7. int strict_strtoull(const char *cp, unsigned int base, unsigned long long *res)  
  8. int strict_strtoll(const char *cp, unsigned int base, long long *res)  
  9. int sprintf(char *buf, const char *fmt, ...)  
  10. int snprintf(char *buf, size_t size, const char *fmt, ...)  
  11. int sscanf(const char *buf, const char *fmt, ...)  

unsigned long long simple_strtoull(const char *cp, char **endp, unsigned int base)
功能:将一个字符串转换成unsigend long long型数据。
返回:返回转换后数据。
参数:cp指向字符串的开始,endp指向分析的字符串末尾的位置,base为要用的基数(进制数),base为0表示通过cp来自动判断基数,函数自动可识别的基数:‘0x’表示16进制,‘0’表示8进制,其它都认定为10进制。函数可转换成数字的有效字符为:[0,f]。举例:cp = “0x12str”,base = 0,则返回unsigned long long为18,*endp = “str”。 参数下同。

unsigned long simple_strtoul(const char *cp, char **endp, unsigned int base)
功能:将一个字符串转换成unsigend long型数据。
返回:返回转换后数据。

long simple_strtol(const char *cp, char **endp, unsigned int base)
功能:将一个字符串转换成sigend long型数据。
返回:返回转换后数据。
说明:该函数调用simple_strtoul,但它先会判断cp指向的字符串的第一个字符是否为负号‘-’。如果为‘-’,它返回负的simple_strtoul的结果。

long long simple_strtoll(const char *cp, char **endp, unsigned int base)
功能:将一个字符串转换成sigend long long型。
返回:返回转换后数据。

int strict_strtoul(const char *cp, unsigned int base, unsigned long *res)
功能:将一个字符串转换成unsigend long型。
返回:转换成功返回0,否则返回负。res指向转换后的unsigned long数据。
说明:该函数对cp指向的字符串严格要求,cp指向的字符串必须为真正的unsigned long形式的字符串。字符串必须以“0x”、“0”、[0,f]开始,中间全部为有效的字符[0,f],否则返回为负。它会处理字符串最后的“\n”字符。下同。

int strict_strtol(const char *cp, unsigned int base, long *res)
功能:将一个字符串转换sigend long型。
返回:转换成功返回0,否则返回负。res指向转换后的signed long数据。

int strict_strtoull(const char *cp, unsigned int base, unsigned long long *res)
功能:将一个字符串转换unsigend long long型。
返回:转换成功返回0,否则返回负。res指向转换后的unsigned long long数据。

int strict_strtoll(const char *cp, unsigned int base, long long *res)
功能:将一个字符串转换sigend long long型。
返回:转换成功返回0,否则返回负。res指向转换后的signed long long数据。

int sprintf(char *buf, const char *fmt, ...)
功能:格式化输出字符串,类似于printf,只是用字符串buf作为输出对象。
返回:返回写入buf字符串的字符个数。

int snprintf(char *buf, size_t size, const char *fmt, ...)
功能:格式化输出字符串,类似于printf,只是用字符串buf作为输出对象。其中size为buf的大小(包括‘\0’字符)。
返回:返回写入buf字符串的字符个数。

int sscanf(const char *buf, const char *fmt, ...)
功能:格式化输入字符串,类似于scanf,只是用字符串buf作为输入对象。
返回:返回读取buf字符串的字符个数。


lib/kasprintf
  1. char *kasprintf(gfp_t gfp, const char *fmt, ...)  

char *kasprintf(gfp_t gfp, const char *fmt, ...)
功能:格式化输出字符串到一段且gfp分配的内存中。
返回:返回指向该内容的字符串指针。


simple_strtoul函数解析

函数说明 
就是解析字符串cp 中 8,10,16 进制数字   ,返回值是解析的数字,endp 指向第一个不是数值的字符串起始处,base :进制 

unsigned long long simple_strtoull(const char *cp, char **endp, unsigned int base)
{
 unsigned long 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)) {//检查当前cp是否是个十六进制数值,不是直接返回0
  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;
}

 

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值