1. 程式人生 > >atoi函式原始碼

atoi函式原始碼

isspace(int x)
{
 if(x==' '||x=='\t'||x=='\n'||x=='\f'||x=='\b'||x=='\r')
  return 1;
 else  
  return 0;
}
isdigit(int x)
{
 if(x<='9'&&x>='0')         
  return 1; 
 else 
  return 0;

}
int atoi(const char *nptr)
{
        int c;              /* current char */
        int 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 */
}

 
看了atol的實現,發現char到int的轉換比較奇怪:c = (int)(unsigned char)*nptr++; 先將char轉為unsigned再轉為int,於是測試了下,發現有如下結果:
#include<stdio.h>

void main()
{
    char c = 0x80;
    unsigned char uc = 0x80;
    printf("c2i=%x,c2ui=%x,uc2i=%x,uc2ui=%x\n", \
    (int)c,(unsigned int)c,(int)uc,(unsigned int)uc
    );
}

結果:
c2i=ffffff80,c2ui=ffffff80,uc2i=80,uc2ui=80

可以發現,如果char預設為signed(可能是平臺相關的),則將char轉為int或uint時,會有符號位擴充套件,而unsigned char則不會。atol/atoi函式應該希望避免符號位擴充套件而帶來問題。不過,好在數字0到9的ACSII碼並沒有超過0x7F,因此是否事先轉成unsigned char應該不會對結果有影響。

itoa()函式有3個引數:第一個引數是要轉換的數字,第二個引數是目標字串,第三個引數是轉移數字時所用 的基數。
將一個整數轉化為字串 
*/  
void my_itoa(int n,char s[])  
{  
    int i,j,sign;  
  
    if((sign=n)<0)    //記錄符號  
        n=-n;         //使n成為正數  
    i=0;  
    do{  
        s[i++]=n%10+'0';    //取下一個數字  
    }while((n/=10)>0);      //迴圈相除  
  
    if(sign<0)  
        s[i++]='-';  
    s[i]='\0';  
    for(j=i-1;j>=0;j--)        //生成的數字是逆序的,所以要逆序輸出  
        printf("%c",s[j]);  
}  

相關推薦

atoi函式原始碼

isspace(int x) { if(x==' '||x=='\t'||x=='\n'||x=='\f'||x=='\b'||x=='\r') return 1; else return 0; } isdigit(int x) { if(x<=

yolo v2 損失函式原始碼解讀

前提說明:     1, 關於 yolo 和 yolo v2 的詳細解釋請移步至如下兩個連結,或者直接看論文(我自己有想寫 yolo 的教程,但思前想後下面兩個連結中的文章質量實在是太好了_(:з」∠)_)         yo

python3-實現atoi()函式

0.摘要 本文介紹c語言中的atoi函式功能,並使用python3實現。   1.atoi()函式 atoi (表示 ascii to integer)是把字串轉換成整型數的一個函式。 函式定義形式:int atoi(const char *nptr); 函式會掃描

gnu c的setbuf函式原始碼

libio/sebuf.c定義了sebbuf函式:void setbuf (FILE *fp, char *buf){  _IO_setbuffer (fp, buf, BUFSIZ);} libio/iosetbuffer.c定義了_IO_setbuffer函式:void _IO_s

atoi函式的用法及用C語言實現ato

庫函式原型: #inclue <stdlib.h> int atoi(const char *nptr); 用法:將字串裡的數字字元轉化為整形數。返回整形值。 注意:轉化時跳過前面的空格字元,直到遇上數字或正負符號才開始做轉換,而再遇到非數字或字串結束時('/0')才結束

python實現atoi函式

思路: 1、過濾掉字串開頭的一個或多個空格,用strip()函式實現; 2、判斷過濾之後的字串是否為空,如果為空,返回0; 3、當字串不為空,判斷第一個字元是否為+/-,即獲取並儲存正負號sign; 4、遍歷字串,如果子串僅僅包含連續的0~9之間的數字,那麼記錄該子串並轉換為數字,一

【181129】VC++ GDI+程式設計必備的原始碼庫_各種繪圖與影象處理函式原始碼

VC++ GDI+程式設計必備的原始碼庫,包含GDI+各個方面的程式設計示例。 以下是各種功能列表: 畫筆 從畫刷中構造畫筆 自定義線型 畫筆的對齊方式 畫筆的縮放與旋轉 畫筆的線帽屬性 畫筆的透明度支援

atoi 函式自實現

1 #include <stdio.h> 2 /* 3 編碼實現字串轉整型的函式(實現函式 atoi 的功能)。如將字串“123”轉化為 123, 4 “-0123”轉化為-123 5 */ 6 int myatoi(const char *p) 7 { 8 int

source insight 新增系統庫函式原始碼(包含原始碼下載下載地址)

1、在BASE專案下新增Project->Open Project ,開啟Base專案2、開啟PreferencesProject->Preferences,選擇Symbol Lookups選項卡3、開啟Import Symbols for All

【轉載】atoi() 函式 與 itoa()函式

ANSI C 規範定義了 stof()、atoi()、atol()、strtod()、strtol()、strtoul() 共6個可以將字串轉換為數字的函式,大家可以對比學習。另外在 C99 / C++11 規範中又新增了5個函式,分別是 atoll()、strtof()、s

C語言itoa()函式atoi()函式詳解(整數轉字元)

轉自:http://c.biancheng.net/cpp/html/792.html C語言提供了幾個標準庫函式,可以將任意型別(整型、長整型、浮點型等)的數字轉換為字串。 以下是用itoa()函式將整數轉換為字串的一個例子:# include <stdio.h># include

C語言基礎字串函式原始碼

#include <stdio.h> #include <assert.h> /* * 作用:獲取串str的長度 */ int strlen(const char *pcStr) { assert(pcStr != NULL); int iLen = 0;

atoi()函式與c_str()函式使用

C 語言 atoi()函式 描述 C 庫函式 int atoi(const char *str) 把引數 str 所指向的字串轉換為一個整數(型別為 int 型)。但不適用於string類串,可以使用string物件中的c_str()函式進行轉換。 宣告 int atoi(c

YOLO v2 損失函式原始碼分析

損失函式的定義是在region_layer.c檔案中,關於region層使用的引數在cfg檔案的最後一個section中定義。 首先來看一看region_layer 都定義了那些屬性值: layer make_region_layer(int batch, int w, int h, int n,

R語言-函式原始碼檢視

> library(fpc) > dbscan function (data, eps, MinPts = 5, scale = FALSE, method = c("hybrid",      "raw", "dist"), seeds = TRUE, showplot = FALSE, cou

實現atoi函式(C++實現)

atoi將string型別轉換為int型別。需要注意的點:     1考慮上溢和下溢的情況     2遇到空格需要處理     3設定一個flag用來記錄正負號,如果遇到的為“+”,flag=1;如果遇到的為“-”,flag=-1;     4將對應的char型別字元轉換為整

atoi函式的實現

<span style="font-family: Arial, Helvetica, sans-serif;">atoi庫函式是在求職面試中常被問到的一個題,我想這是考慮一個程式設計師對一個問題分析是否全面的一種測試吧。</span> 正確實現at

jQuery.extend函式原始碼詳解

測試程式碼1: var x = { name:"CodePlayer", age: 20 }; var y = { age: 18 }; var z = { site: "www.365mini.co

str類常用函式原始碼

strlen() 求字串的長度 原始碼: #include<assert.h> //strlen 原始碼 int strlen(const char *str) {     assert(*str != '\0');        //斷言,判斷字串是否為空,下

C語言字串轉整數atoi函式

/*字元轉整數(包括負數) */ #include<stdio.h> int atoi(char *string)     {int value=0,flag=0;while((*stri