• atoi() & itoa()函数的内部的实现 2


    /***
    *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;
    }

  • 相关阅读:
    ASP.NET存储过程自定义分页详解
    ajax php POST 提交例子
    一个用存储过程的基本分页及其调用
    DataGrid 存储过程的分页
    无刷新无限级菜单联动
    asp.net URL多参数傳值以及特殊符号传值问题
    ASP.NET页面间参数的传递
    Android动画开发——Animation动画效果
    android surface
    Android控件属性——android:cacheColorHint=“#00000000”
  • 原文地址:https://www.cnblogs.com/black/p/5171591.html
Copyright © 2020-2023  润新知