您的位置:首页 > 编程语言 > C语言/C++

自己实现C语言atoi函数和线程安全版的itoa函数

2016-02-18 15:48 399 查看
C语言atoi函数是用来将字符串转化为int型整数的,itoa功能相反。下面是我自己实现的这两个函数,均为线程安全的。代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#include <iostream>
#include <cmath>

using namespace std;

//将一个字符转化为数字
int chartoi(const char cp)
{
if ('0' <= cp&&'9' >= cp)
{
//字符数字在内存中的值都是通过自身加上0x30得到的
return cp - 0x30;
}
else
{
printf_s("error input.%s, %d", __FILE__, __LINE__);
return -1;
}
}

//内置类型,直接传值
int myatoi(const char* ptr)
{
const char* tmptr = NULL;
int neg = 0;
int len = 0, temp_len = 0;
int value = 0;

len = strlen(ptr);
temp_len = len;

if ('-' == ptr[0])
{
tmptr = ptr + 1;
--temp_len;
}
else
{
neg = 1;
tmptr = ptr;
}

while (temp_len > 0)
{
value += chartoi(*tmptr) * pow(10, (temp_len - 1));
temp_len--;
tmptr++;
}

if (neg == 0)
return 0 - value;
else
return value;
}

//线程安全版本1(由用户自己制定一块内存并将地址传入,
//此内存可以为栈上的也可以是堆上的)
int myitoa(int num, char* ptr)
{
if (NULL == ptr)
return 1;

int neg = 0, i = 0;
int temp = num;
char buf[128];
memset(buf, 0, sizeof(buf));

if (num > 0)
neg = 1;
else
temp = 0 - num;

while (temp > 0)
{
buf[i++] = temp % 10 + 0x30;
temp /= 10;
}
if (neg == 0)
{
buf[i] = '-';
}
reverse(buf, buf+strlen(buf));

sprintf_s(ptr, strlen(buf)+1, buf);

return 0;
}

//线程安全版本2(直接通过函数在堆上开辟内存并传出,
//注意使用完需要free堆上的内存)
char* myitoa(int num)
{
int neg = 0, i = 0;
int temp = num;

char* buf = (char*)malloc(128);
if (NULL == buf)
return NULL;

if (num > 0)
neg = 1;
else
temp = 0 - num;

while (temp > 0)
{
buf[i++] = temp % 10 + 0x30;
temp /= 10;
}
if (neg == 0)
{
buf[i++] = '-';
buf[i] = '\0';
}
else
{
buf[i] = '\0';
}

reverse(buf, buf + strlen(buf));

return buf;
}

//线程安全版本3(通过传入二级指针在函数内部向堆上申请内存,也可以通过
//传入指针的引用实现,但是需注意使用完了之后需要free堆上的内存)
int myitoa(int num, char** ptr)
{
int neg = 0, i = 0;
int temp = num;

*ptr = (char*)malloc(128);
if (NULL == ptr)
{
return 1;
}

if (num > 0)
neg = 1;
else
temp = 0 - num;

while (temp > 0)
{
(*ptr)[i++] = temp % 10 + 0x30;
temp /= 10;
}
if (neg == 0)
{
(*ptr)[i++] = '-';
(*ptr)[i] = '\0';
}
else
{
(*ptr)[i] = '\0';
}

reverse(*ptr, *ptr + strlen(*ptr));

return 0;
}

int main()
{
char *p = "-123";
int a = -123;
char* buf;

//myitoa(a, &buf);

printf("%d\n", myatoi(p));
//printf("%s\n", buf);
//free(buf);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: