自己实现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; }
相关文章推荐
- C++库(长期补充)
- bag of word && C++图像批量读写
- neuq oj 1036: 谭浩强C语言(第三版)习题1.6 求最大值 C++
- C++ 将浮点数的前四位存为string
- 单例模式及其C++实现
- C++Builder 2010深入TObject类
- 单链表的简单应用
- c++ 根据指针类型获取原类型
- VC++的窗口句柄和窗口ID
- Cef概览
- Cef重要概念
- C语言二分查找法
- Cef应用资源布局
- Cef应用程序结构
- 多重继承《C++ primer 3th》
- neuq oj 1034: C基础-求同存异 C++
- [C/C++不常见语法特性]_[初级]_[左值-右值-lvalue-rvalue]
- [C/C++不常见语法特性]_[初级]_[左值-右值-lvalue-rvalue]
- [群150178878]nRF51822学习笔记–硬件外设篇【1】
- C++ vector 自定义类,重载==操作符,使用STL的find查找