zoukankan      html  css  js  c++  java
  • 整理atoi itoa的实现

    一、atoi

    原型:

    int atoi(const char *nptr);

    参数nptr字符串,如果第一个非空格字符存在,是数字或者正负号则开始做类型转换,之后检测到非数字(包括结束符 ) 字符时停止转换,返回整型数。否则,返回零,

      1 #include<stdlib.h>
      2 #include<stdio.h>
      3 int main(void)
      4 {
      5 #if 0
      6     float n;
      7     char*str="12345.67cd";//12345.000000
      8 //  char*str="-12345.67cd";//-12345.000000
      9 //  char*str="ab12345.67cd";//0.000000
     10     n=atoi(str);
     11     printf("string=%s integer=%f ",str,n);
     12 #else
     13
     14     char a[]="-110";
     15     char b[]="123";
     16     int  c;
     17     c = atoi(a) + atoi(b);
     18     printf("c=%d ",c);//13
     19 #endif
     20     return 0;
     21 }

    2、itoa

    char *itoa( int value, char *string,int radix);
    原型说明:
    value欲转换的数据。
    string:目标字符串的地址。
    radix:转换后的进制数,可以是10进制、16进制等。
     
    程序实例:
     
    #include <stdlib.h>
    #include <stdio.h>
    int main(void)
    {
        int number = 12345;
        char string[32];
        itoa(number, string, 10);
        printf("integer = %d string = %s ", number, string);
        return 0;
    }
    itoa 并不是一个标准的C函数,它是Windows特有的,如果要写跨平台的程序,请用sprintf。
    标准库中有sprintf,功能比这个更强,用法跟printf类似:
    char str[255];
    sprintf(str, "%x", 100); //将100转为16进制表示的字符串。
     摘抄itoa实现:
     
    1、
    void itoa(int n,char s[])
    {
    int i,j,k,sign;
    char tmp;
    if((sign=n)<0)
           n=-n;
            i=0;
    do{
             s[i++]=n%10+'0';
      }
    while ((n/=10)>0);
            if(sign<0)
                     s[i++]='-';
    s[i]='';
    //printf("debug int n: %d ",n); 
    //printf("debug char s: %s ",s);
    /*
    for debug input int i and output char s[];
    */
    for(j=i-1,k=0;j>((i-1)/2);j--,k++)
     {
           tmp=s[k];
          s[k]=s[j];
          s[j]=tmp;
     }
     //printf("debug str: %s ",s);
    2、
    转一个高效方法
    C/C++ code
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     char   *myitoa(   int   value,   char   *str,   int   radix   )   
      {   
      static   char   szMap[]   =   {   
      '0',   '1',   '2',   '3',   '4',   '5',   
      '6',   '7',   '8',   '9',   'a',   'b',   
      'c',   'd',   'e',   'f',   'g',   'h',   
      'i',   'j',   'k',   'l',   'm',   'n',   
      'o',   'p',   'q',   'r',   's',   't',   
      'u',   'v',   'w',   'x',   'y',   'z'   
      }; //   字符映射表   
      int   nCount   =   -1,   nIndex;   
      char   *pStr   =   str,   nTemp;   
      if   (   radix   >=   2   &&   radix   <=   36   )   
      {   //   限制radix必须在2到36之间   
      if   (   value   <   0   &&   radix   ==   10   )   
      {   //   如果是负数就在首位添加负号,并将字符串前移   
      *pStr++   =   '-';   
      value   =   -value;   //转为正数,   
      }   
      unsigned   int   nValue   =   *(unsigned*)&value;   
      do   //   循环转换每一个数字,直到结束   
      pStr[   ++nCount   ]   =   szMap[   nValue   %   radix   ];   
      nValue   /=   radix;   
      }   while(   nValue   >   0   );   //   转换结束后字符串是翻的   
      nIndex   =   (   nCount   +   1   )   /   2;   //   计算出一半的长度   
      while(   nIndex--   >   0   )   {   //   将字符串的字符序翻转   
      nTemp   =   pStr[   nIndex   ];   
      pStr[   nIndex   ]   =   pStr[   nCount   -   nIndex   ];   
      pStr[   nCount   -   nIndex   ]   =   nTemp;   
      }   
      }   
      pStr[   nCount   +   1   ]   =   '';   //   置结束符   
      return   str;   
      }   
       
    3、转一个看看
    C/C++ code
     
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    /***
    *atox.c - atoi and atol conversion
    *
    * Copyright (c) 1989-1997, Microsoft Corporation. All rights reserved.
    *
    *Purpose:
    * Converts a character string into an int or long.
    *
    *******************************************************************************/
     
    #include <cruntime.h>
    #include <stdlib.h>
    #include <ctype.h>
     
    /***
    *long atol(char *nptr) - Convert string to long
    *
    *Purpose:
    * Converts ASCII string pointed to by nptr to binary.
    * Overflow is not detected.
    *
    *Entry:
    * nptr = ptr to string to convert
    *
    *Exit:
    * return long int value of the string
    *
    *Exceptions:
    * None - overflow is not detected.
    *
    *******************************************************************************/
     
    long __cdecl atol(
    const char *nptr
    )
    {
    int c; /* current char */
    long total; /* current total */
    int sign; /* if ''-'', then negative, otherwise positive */
     
    /* skip whitespace */
    while isspace((int)(unsigned char)*nptr) )
    ++nptr;
     
    c = (int)(unsigned char)*nptr++;
    sign = c; /* save sign indication */
    if (c == ''-'' || c == ''+'')
    c = (int)(unsigned char)*nptr++; /* skip sign */
     
    total = 0;
     
    while (isdigit(c)) {
    total = 10 * total + (c - ''0''); /* accumulate digit */
    c = (int)(unsigned char)*nptr++; /* get next char */
    }
     
    if (sign == ''-'')
    return -total;
    else
    return total; /* return result, negated if necessary */
    }
     
     
    /***
    *int atoi(char *nptr) - Convert string to long
    *
    *Purpose:
    * Converts ASCII string pointed to by nptr to binary.
    * Overflow is not detected. Because of this, we can just use
    * atol().
    *
    *Entry:
    * nptr = ptr to string to convert
    *
    *Exit:
    * return int value of the string
    *
    *Exceptions:
    * None - overflow is not detected.
    *
    *******************************************************************************/
     
    int __cdecl atoi(
    const char *nptr
    )
    {
    return (int)atol(nptr);
    }
     
    #ifndef _NO_INT64
     
    __int64 __cdecl _atoi64(
    const char *nptr
    )
    {
    int c; /* current char */
    __int64 total; /* current total */
    int sign; /* if ''-'', then negative, otherwise positive */
     
    /* skip whitespace */
    while isspace((int)(unsigned char)*nptr) )
    ++nptr;
     
    c = (int)(unsigned char)*nptr++;
    sign = c; /* save sign indication */
    if (c == ''-'' || c == ''+'')
    c = (int)(unsigned char)*nptr++; /* skip sign */
     
    total = 0;
     
    while (isdigit(c)) {
    total = 10 * total + (c - ''0''); /* accumulate digit */
    c = (int)(unsigned char)*nptr++; /* get next char */
    }
     
    if (sign == ''-'')
    return -total;
    else
    return total; /* return result, negated if necessary */
    }
     
    #endif /* _NO_INT64 */
     
     
    #include <msvcrt/errno.h>
    #include <msvcrt/stdlib.h>
    #include <msvcrt/internal/file.h>
    char* _itoa(int value, char* string, int radix)
    {
    char tmp[33];
    char* tp = tmp;
    int i;
    unsigned v;
    int sign;
    char* sp;
     
    if (radix > 36 || radix <= 1)
    {
    __set_errno(EDOM);
    return 0;
    }
     
    sign = (radix == 10 && value < 0);
    if (sign)
    v = -value;
    else
    v = (unsigned)value;
    while (v || tp == tmp)
    {
    i = v % radix;
    v = v / radix;
    if (i < 10)
    *tp++ = i+''0'';
    else
    *tp++ = i + ''a'' - 10;
    }
     
    if (string == 0)
    string = (char*)malloc((tp-tmp)+sign+1);
    sp = string;
     
    if (sign)
    *sp++ = ''-'';
    while (tp > tmp)
    *sp++ = *--tp;
    *sp = 0;
    return string;
    }
     
    4、
    1 //n是要被转换的十进制数,bit是要被转换的进制数
    2 #include <iostream>
    3 #include <string>
    4 using namespace std;
    5
    6 char * Ten_to_other(int num,char* str, int radix)
    7 {
    8     const char a[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    9     char *ptr=str;
    10     bool negtive = false;
    11     if(num==0)
    12     {
    13         *ptr++=0;
    14         *ptr='';
    15         return NULL;//直接就退出,不走后面的情况了,不跟后面共用一个return语句。
    16     }
    17     if(num<0)
    18     {
    19         num *= -1;
    20         *ptr++ ='-';
    21         negtive = true;
    22     }
    23     while(num) //不能处理num=0的情况
    24     {
    25         *ptr++=a[num%radix];
    26         num /= radix;
    27     }
    28     *ptr='';//此时ptr已经指向字符串结尾,而str仍旧指向字符串开始。
    29     ptr--;//让ptr指向字符串内容!!
    30     char *start=(negtive)? str+1:str;//注意此处不能写str++,否则,str不指向保存值的首地址了
    31     while(start<ptr)
    32     {
    33         char tmp=*ptr;
    34         *ptr=*start;
    35         *start=tmp;
    36         ptr--;
    37         start++;
    38         /*char tmp=*ptr--;//这样写ptr,str都加了那么多遍,肯定错了啊!!!
    39         *ptr--=*str++;
    40         *str++=tmp;*/
    41     }
    42     /*int len=strlen(str);
    43     int i = (negtive)? 1:0;
    44     for(i; i<len/2; ++i) //当为负数时候,str字符串最后的字符不能用len-1-i了,因为此时i=1而不是0
    45     {
    46         char tmp = str[i];
    47         str[i]=str[len-1-i];
    48         str[len-1-i]=tmp;
    49     } */
    50     return NULL;
    51 }
    52 int main()
    53 {
    54     char a[12]={0};
    55     Ten_to_other(-82,a,6);
    56     cout<<a<<endl;
    57     system("pause");
    58     return 0;
    59 }
     
     
     
     
     
     
     
  • 相关阅读:
    向对象(OO)程序设计
    gVim安装vim-template插件后提示Undefined variable vim_template_subtype/Press ENTER or type command to continue
    基于JQuery easyui,gson的批量新增/修改和删除-servlet版
    Java正则表达式-匹配正负浮点数
    自己写的ORM工具
    秋色园学习测试项目
    把aspx页面生成的cs文件放到其他类库中,以实现对其的封装操作.
    杭州蚂蚁中台技术部-22届应届生-校招实习
    博客园开博
    开发随手记
  • 原文地址:https://www.cnblogs.com/flying06/p/3828438.html
Copyright © 2011-2022 走看看