c语言字符串转整型函数实现

简介

由于有些设备平台出于某些目的,不提供c函数库中的字符串转整型函数。为此,本文在这里提供一些"轮子"。

atoi()函数实现

int isDigit(char c) 
{
    return (c >= '0') && (c <= '9');
}

int myAtoi(char *str) 
{
    int result = 0;
    int neg_multiplier = 1;

    // Scrub leading whitespace
    while (*str && (
            (*str == ' ') ||
            (*str == '\t'))) 
        str++;

    // Check for negative
    if (*str && *str == '-') {
        neg_multiplier = -1;
        str++;
    }

    // Do number
    for (; *str && isDigit(*str); str++) {
        result = (result * 10) + (*str - '0');
    }

    return result * neg_multiplier;
}

itoa()函数实现

#include <stdio.h>
#include <math.h>

char *itoarl(int64_t num, char *dest, int destlen) {
    char buf[60];
    int neg = num < 0;
    int bufind = 0;
    int i;

    if (neg) {
        num *= -1;
    }

    // Now, scrub off the digits
    while (num > 0) {
        int digit = num%10;
        buf[bufind++] = '0'+digit;
        num /= 10;
    }
    if (neg) {
        buf[bufind++] = '-';
    }

    buf[bufind]='\0';

    if (bufind > destlen) {
        return (char*)0;
    }

    // Now we have it reversed -- reverse it back into the dest.
    dest[bufind]=buf[bufind];
    bufind--;
    for (i=0; bufind >= 0; i++, bufind--) {
        dest[bufind] = buf[i];
    }
    return dest;
}

int64_t Pow(num, exp) {
    int64_t result = 1;

    for (; exp > 0; exp--) {
        result *= num;
    }

    return result;
}

char *itoalr(int64_t num, char *dest, int destlen) {
    int neg = num < 0;
    int bufind = 0;

    if (neg) {
        num *= -1;
        dest[bufind++]='-';
    }

    // How many digits are in the string?
    float fnumDigits = log10(num);
    int numDigits = (int)fnumDigits;

    if ((float)numDigits != fnumDigits) 
        numDigits ++;

    //printf("Num: %lld  Digits: %d (fDigits): %f\n", num, numDigits, fnumDigits);

    // Now walk through
    for (int exp = numDigits -1; exp >= 0; exp--) {
        int64_t mask = Pow(10, exp);
        int digit = num / mask;
        int64_t sub = digit * mask;

        num -= sub;
        dest[bufind++] = '0'+digit;
    }
    dest[bufind]='\0';
    return dest;
}

char *itoa(int64_t num, char *dest, int destlen) {
    return itoarl(num, dest, destlen);
}

atof()函数实现

static int is_digit(char ch)
{   
  if(ch>='0'&&ch<='9')
    return 1;
  else
    return 0;
} 

static int is_space(char ch)
{   
  if(ch==' ')
    return 1;
  else
    return 0;
}

static double _atof(char *s)
{
  double power,value;
  int i,sign;
  for(i=0;is_space(s[i]);i++);//除去字符串前的空格
  sign=(s[i]=='-')?-1:1;
  if(s[i]=='-'||s[i]=='+')//要是有符号位就前进一位
    i++;
  for(value=0.0;is_digit(s[i]);i++)//计算小数点钱的数字
    value=value*10.0+(s[i]-'0');
  if(s[i]=='.')
    i++;
  for(power=1.0;is_digit(s[i]);i++)//计算小数点后的数字
  { 
    value=value*10.0+(s[i]-'0');
    power*=10.0;
  } 

  return sign*value/power;
} 

字符串转十六进制

代码实现:
/*

  • pbDest 16进制数组
  • 目标16进制字符串
    */ 16进制字符串数字个数
void StrToHex(uint8_t *pbDest, uint8_t *pbSrc, int nLen)
{
  char h1,h2;
  char s1,s2;
  int i;

    for (i=0; i<nLen; i++)
    {
        h1 = pbSrc[2*i];
        h2 = pbSrc[2*i+1];

        s1 = toupper(h1) - 0x30; //toupper 转换为大写字母
        if (s1 > 9)
            s1 -= 7;
        s2 = toupper(h2) - 0x30;
        if (s2 > 9)
            s2 -= 7;

        pbDest[i] = s1*16+s2;
    }
}
  uint8_t str[10]={0};
  uint8_t *hex = "1a2a3aff1c3d";
  StrToHex(str, hex, 6);

输出
1a 2a 3a ff 1c 3d 0 0 0 0

16进制转字符串

void hexToStr(char *ptr,unsigned char *buf,int len)
{
	for(int i = 0; i < len; i++)
	{
		sprintf(ptr, "%02x",buf[i]);
		ptr += 2;
	}
}
uint8_t str[10]={0};
uint8_t array[10]={0x01,0x02,0x03};
hexToStr(str, array, 3);
printf("str=%s\n", str);
 **输出**
str=010203
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路过的小熊~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值