首先看atoi函数:

C语言库函数名: atoi
功 能: 把字符串转换成整型数。
名字来源:ASCII to integer 的缩写。
原型: int atoi(const char *nptr);
函数说明: 参数nptr字符串,如果第一个非空格字符存在,是数字或者正负号则开始做类型转换,之后检测到非数字(包括结束符 \0) 字符时停止转换,返回整型数。否则,返回零,(意思是遇到非数字或结束符就停止)
头文件: #include <stdlib.h>
输入: -123ab;结果为-123;
输入:abc,输出0.
实现:
int atoiOwn(const char *a)
{
int val=;
bool b_plus=true;//判断符号
switch(*a) //过滤符号
{
case '+':
a++;
break;
case '-':
a++;
b_plus=false;
break;
default:
break;
} while(*a>='0'&&*a<='9') //可以用isdigit判断。
{
val=val*+(*a-'');
a++;
}
if(!b_plus)
val=-val;
return val;
}
int main()
{ char a[];
while(scanf("%s",a)!=EOF)
{
int ret=atoiOwn(a);
printf("%d\n",ret);
}
}
char *itoa(int value, char *string, int radix);
int value 被转换的整数,char *string 转换后储存的字符数组,int radix 转换进制数,如2,8,10,16 进制等
char *  itoa ( int value, char * str, int base );
Convert integer to string (non-standard function)

Converts an integer value to a null-terminated string using the specified base and stores the result in the array given by str parameter.

If base is 10 and value is negative, the resulting string is preceded with a minus sign (-). With any other basevalueis always considered unsigned.

str should be an array long enough to contain any possible value: (sizeof(int)*8+1) for radix=2, i.e. 17 bytes in 16-bits platforms and 33 in 32-bits platforms.

This function is not defined in ANSI-C and is not part of C++, but is supported by some compilers.

A standard-compliant alternative for some cases may be sprintf:

  • sprintf(str,"%d",value) converts to decimal base.
  • sprintf(str,"%x",value) converts to hexadecimal base.
  • sprintf(str,"%o",value) converts to octal base.

以下的代码只是模拟了部分功能:

#include<stdio.h>
void itoa(int value, char *str)
{
if (value < ) //如果是负数,则str[0]='-',并把value取反(变成正整数) {
str[] = '-';
value = -value;
}
int i,j;
for(i=; value > ; i++,value/=) //从value[1]开始存放value的数字字符,不过是逆序,等下再反序过来 str[i] = value%+''; //将数字加上0的ASCII值(即'0')就得到该数字的ASCII值 for(j=i-,i=; j-i>=; j--,i++) //将数字字符反序存放 {
str[i] = str[i]^str[j];
str[j] = str[i]^str[j];
str[i] = str[i]^str[j];
}
if(str[] != '-') //如果不是负数,则需要把数字字符下标左移一位,即减1 {
for(i=; str[i+]!='\0'; i++)
str[i] = str[i+];
str[i] = '\0';
}
} void main()
{
int value = -;
char str[10] = {'\0'}; //记得把str全填充为'\0' 这个错误,其实这样赋值只是把第
1个元素赋值为\0,后面的都默认用\0填充,如果是char str[10]={'1'};
只有第一个为‘1’,后面都是\0.但千万不要以为写成char str[10];不赋值也可以。这样写里面的内容是乱的。

itoa(value, str);
printf("The result is:%s\n", str);
}

另一种写法:

void intToStr(int num,char str[])
{
int i=,j=,isNeg=;
if(num<)
{
num*=-;
isNeg=;
}
do{
str[i++]=(num%)+'';
num/=;
}while(num); if(isNeg)
str[i++]='-'; //reverse the characher;
for(int m=,n=i-;m<n;m++,n--)
swap(str[m],str[n]); str[i]='\0';
}

为什么写成:

do{
str[i++]=(num%10)+'0';
num/=10;
}while(num);
而不是
while(num)
{
   }
因为当输入为0时,while(num)一次都不会执行,导致最后输出的是空串。因为至少要执行一次,所以用do while.

更好的办法:

http://blog.csdn.net/solstice/article/details/5139302

http://stackoverflow.com/questions/3440726/what-is-the-proper-way-of-implementing-a-good-itoa-function

参考;http://www.cppblog.com/lizhongxu2008/archive/2009/02/11/73470.html

许多实现:http://www.jb.man.ac.uk/~slowe/cpp/itoa.html#dev

/**

 * Ansi C "itoa" based on Kernighan & Ritchie's "Ansi C":

 */

void strreverse(char* begin, char* end) {

    char aux;

    while(end>begin)

        aux=*end, *end--=*begin, *begin++=aux;

}

void itoa(int value, char* str, int base) {

    static char num[] = "0123456789abcdefghijklmnopqrstuvwxyz";

    char* wstr=str;

    int sign;

    // Validate base

    if (base< || base>){ *wstr='\0'; return; }

    // Take care of sign

    if ((sign=value) < ) value = -value;

    // Conversion. Number is reversed.

    do *wstr++ = num[value%base]; while(value/=base);

    if(sign<) *wstr++='-';

    *wstr='\0';

    // Reverse string

    strreverse(str,wstr-);

}

/**

 * Ansi C "itoa" based on Kernighan & Ritchie's "Ansi C"

 * with slight modification to optimize for specific architecture:

 */

void strreverse(char* begin, char* end) {

    char aux;

    while(end>begin)

        aux=*end, *end--=*begin, *begin++=aux;

}

void itoa(int value, char* str, int base) {

    static char num[] = "0123456789abcdefghijklmnopqrstuvwxyz";

    char* wstr=str;

    int sign;

    div_t res;

    // Validate base

    if (base< || base>){ *wstr='\0'; return; }

    // Take care of sign

    if ((sign=value) < ) value = -value;

    // Conversion. Number is reversed.

    do {

        res = div(value,base);

        *wstr++ = num[res.rem];

    }while(value=res.quot);

    if(sign<) *wstr++='-';

    *wstr='\0';

    // Reverse string

    strreverse(str,wstr-);

}

c语言实现atoi和itoa函数。的更多相关文章

  1. 面试:atoi() 与 itoa()函数的内部实现(转)

    原 面试:atoi() 与 itoa()函数的内部实现 2013年04月19日 12:05:56 王世晖 阅读数:918   #include <stdio.h> #include < ...

  2. atoi()和itoa()函数详解以及C语言实现

    atoi()函数 atoi()原型:  int atoi(const char *str ); 函数功能:把字符串转换成整型数. 参数str:要进行转换的字符串 返回值:每个函数返回 int 值,此值 ...

  3. c++实现atoi()和itoa()函数(字符串和整数转化)

    (0) c++类型所占的字节和表示范围 c 语言里 类型转换那些事儿(补码 反码) 应届生面试准备之道 最值得学习阅读的10个C语言开源项目代码 一:起因 (1)字符串类型转化为整数型(Integer ...

  4. atoi和itoa函数的实现方法

    atoi的实现: #include<iostream> using namespace std; int atio1(char *s) { int sign=1,num=0; if(*s= ...

  5. C语言itoa()函数和atoi()函数详解(整数转字符C实现)

    1.int/float to string/array: C语言提供了几个标准库函数,可以将任意类型(整型.长整型.浮点型等)的数字转换为字符串,下面列举了各函数的方法及其说明. ● itoa():将 ...

  6. C语言itoa()函数和atoi()函数详解(整数转字符)

    http://c.biancheng.net/cpp/html/792.html C语言提供了几个标准库函数,可以将任意类型(整型.长整型.浮点型等)的数字转换为字符串. 以下是用itoa()函数将整 ...

  7. C语言itoa函数和atoi 函数

    C语言提供了几个标准库函数,可以将任意类型(整型.长整型.浮点型等)的数字转换为字符串.以下是用itoa()函数将整数转 换为字符串的一个例子: # include <stdio.h>  ...

  8. [置顶] C语言itoa()函数和atoi()函数详解(整数转字符C实现)

    头文件:#include <stdlib.h> atoi() 函数用来将字符串转换成整数(int),其原型为: int atoi (const char * str); [函数说明]ato ...

  9. 【转载】C语言itoa()函数和atoi()函数详解(整数转字符C实现)

    本文转自: C语言itoa()函数和atoi()函数详解(整数转字符C实现) 介绍 C语言提供了几个标准库函数,可以将任意类型(整型.长整型.浮点型等)的数字转换为字符串. int/float to ...

随机推荐

  1. [置顶] 浅谈大型web系统架构

    转载原文:http://blog.csdn.net/dinglang_2009/article/details/6863697 分类: 大规模Web 2.0架构 2011-10-11 18:27 12 ...

  2. iPhone APP 扫码下载

    移动互联网发展迅速,各种APP的开发都太疯狂了,一般稍大点儿的应用,都会准备多个版本,比如:iPhone版.iPad版.Android版,我们姑且称之为:终端适配. 业务做的再大点儿的,APP还会考虑 ...

  3. jquery的链式操作以及事件绑定

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. python网络编程——将IPv4地址转换成不同的格式

    1.将IPv4地址转换为32位二进制格式,用做底层网络函数. import socket from binascii import hexlify def convert_IPv4_address() ...

  5. Objective-C 程序设计第四版

    1,@class  XYPoint; 写在.h文件里,告诉编译器有这类,然后用的时候,其实是在.m文件引入的. 例如.#import “XYPoint.h”  然后在.m文件里就能用XYPoint.h ...

  6. Log Collect

    http://ossectools.blogspot.com/2011/03/comprehensive-log-collection.html https://www.hacking-lab.com ...

  7. Windows Phone 8初学者开发—第10部分:数据绑定应用程序和透视应用程序项目模板简介

    原文 Windows Phone 8初学者开发—第10部分:数据绑定应用程序和透视应用程序项目模板简介 原文地址: http://channel9.msdn.com/Series/Windows-Ph ...

  8. 代码中函数、变量、常量 / bss段、data段、text段 /sct文件、.map文件的关系[实例分析arm代码(mdk)]

    函数代码://demo.c #include<stdio.h> #include<stdlib.h> , global2 = , global3 = ; void functi ...

  9. ubuntu15.04安装hexo

    首先吐槽一下npm淘宝源,貌似中国目前唯一一个npm源,现在不好用了,不知道是不是换了地址,在吐槽一下万恶的墙!你懂得. 好了,说点正儿八经的事儿. 之所以安装hexo也是为了创建自己的博客,我只说最 ...

  10. BZOJ 3282: Tree( LCT )

    LCT.. -------------------------------------------------------------------------------- #include<c ...