atoi源碼
❶ 函數解析linuxatoi函數的秘密linuxatoi
Linux atoi函數是一種常見的C/C++內置函數,它可以解析字元串並把它們轉換為整型數字。它的 API 風格(應用程序編程介面)主要包括:擾激
int atoi(const char * str);
我們可以通過上面的 API 把一個字元串轉換成整數。然而,正如我們所知,atoi() 內部實現的秘密是什麼?
要了解 atoi() 函數的實現,我們可以看 Linux 核心源碼,這是啟棚一種 C 函數,它可以在核心代碼庫中找到:
// atoi 函數定義
int atoi(const char * str)
{
int v;
char *endptr ;
// 初始化
v=strtol( str, &endptr, 10);
// 檢查失敗
if( (errno == ERANGE && (v == LONG_MAX || v == LONG_MIN))
|| (errno !=0 && v ==0) ) {
errno = EINVAL;
return 0;
}
if(endptr == str)
return 0;
// 成功,返回 v 的值
return v;
}
atoi() 函數的內部實現完全得益於 strtol() 函數,它是一個受信任緩旁襪的庫函數,可以安全的把字元串轉換成 LONG 類型的數字,假定字元串可以有效的表達數字。另外, strtol() 函數可以轉換任何整型字元串,例如 16 進制和 8 進制,而 atoi() 只能處理 10 進制。
總而言之,atoi() 函數底層實現的秘密就是 strtol() 函數,它可以安全的將字元串轉換成 LONG 類型的數字,假定字元串可以有效的表達數字。這個函數的參數還可以指定字元串的基數,例如 8 進制和 10 進制。最後,將轉換後的數字返回給 atoi() 函數,並將其作為整數返回給程序。
❷ 用C++編一個和atoi功能一樣的函數,實現字元到整形的轉換
下面是實現功能的代碼,函數的逗斗名字是myAtoi
int myAtoi (const char *value) {
register int ret, i, signFlag;
ret = i = 0;
signFlag = 1;
while ((*(value + i)) != 0x00) {
if ((*(value + i)) == 0x2d) {
signFlag = -1;
}
else if ((*(value + i)) >= 0x30 && (*(value + i)) <= 0x39) {
ret *= 10;
ret += ((int)(*(value + i)) - 48);
}
else if (
(ret != 0) &&
((*(value + i)) < 0x30 || (*(value + i)) > 0x39)
) {
return (ret * signFlag);
}
i += 1;
}
return (ret * signFlag);
}
如果是想測試,就用下面的代碼
#include<stdio.h>
int myAtoi (const char *value) {
register int ret, i, signFlag;
ret = i = 0;
signFlag = 1;
while ((*(value + i)) != 0x00) {
if ((*(value + i)) == 0x2d) {
signFlag = -1;
}
else if ((*(value + i)) >= 0x30 && (*(value + i)) <= 0x39) {
ret *= 10;
ret += ((int)(*(value + i)) - 48);
}
else if (
(ret != 0) &&
((*(value + i)) <猜指培 0x30 || (*(value + i)) > 0x39)
) {
return (ret * signFlag);
}
i += 1;
}
return (ret * signFlag);
}
int main () {
char ch1[] = "-100";
char ch2[] = "穗唯- 034g1234";
char ch3[] = "";
printf (「%d\n%d\n%d\n", myAtoi (ch1), myAtoi (ch2), myAtoi (ch3));
return 0;
}
❸ 求C++獲取系統時間源代碼,精確到毫秒
#include <iostream>
#include <windows.h>
using namespace std;
void main()
{
SYSTEMTIME time;//時間結構聲明,這個結構是系統的,
GetSystemTime( &time );//調用獲取系統時間api.
//GetLocalTime();這個函數是獲取本地時間api
char* t_y;
char* t_m;
char* t_h;
char* t_Min;
char* t_s;
char* t_Mi;
char* t_d;
char* t_w;
SYSTEMTIME time;//時間結構聲明,這個結構是系統的,
GetSystemTime( &time );//調用獲取系統時間api.
sprintf(t_y, "%d", time.wYear);//將年份格式輸出到t_y變數中
sprintf(t_m, "%d", time.wMonth);
sprintf(t_w, "%d", time.wDayOfWeek);
sprintf(t_d, "%d", time.wDay);
sprintf(t_h, "%d", time.wHour);
sprintf(t_Min, "%d", time.wMinute);
sprintf(t_s, "%d", time.wSecond);
sprintf(t_Mi, "%d", time.wMilliseconds);
printf("%s,%s,%s,%s,%s,%s,%s,%s",
time.wYear,
time.wMonth,
time.wDayOfWeek,
time.wDay,
time.wHour,
time.wMinute,
time.wSecond,
time.wMilliseconds);
}
/***
SYSTEM 結構成員如下:
SYSTEMTIME STRUCT
{
WORD wYear ; 年
WORD wMonth ;月
WORD wDayOfWeek ;星期,0=星期日,1=星期一...
WORD wDay ;日
WORD wHour ;時
WORD wMinute ;分
WORD wSecond ;秒
WORD wMilliseconds ;毫秒
}SYSTEMTIME ENDS
//***/
❹ c語言中怎麼把字元串中連續的數字變成一個數
C語言庫函數名: atoi
功 能: 把字元串轉換成整型數.
名字來源:array to integer 的縮寫.
函數說明: atoi()會掃描此粗鄭參數nptr字元串,如果第一個字元不森頌是數字也不是正負號返回零,否則開始做類型轉換,之後檢測到非數字或結束符 \0 時停止轉換,返回整凳握型數。
原型: int atoi(const char *nptr);
需要用到的頭文件: #include <stdlib.h>
程序例:
1)
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
int n;
char *str = "12345.67";
n = atoi(str);
printf("string = %s integer = %d\n", str, n);
return 0;
}
執行結果
string = 12345.67 integer = 12345
2)
#include <stdlib.h>
#include <stdio.h>
int main()
{
char a[] = "-100" ;
char b[] = "123" ;
int c ;
c = atoi( a ) + atoi( b ) ;
printf("c = %d\n", c) ;
return 0;
}
執行結果
c = 23
簡單的實現atoi函數的源代碼:
int my_atoi(const char *str){
int result = 0;
int signal = 1; /* 默認為正數 */
if((*str>='0'&&*str<='9')||*str=='-'||*str=='+'){
if(*str=='-'||*str=='+'){
if(*str=='-')
signal = -1; /* 輸入負數 */
str++;
}
}
else return 0;
/* 開始轉換 */
while(*str>='0'&&*str<='9')
result = result*10+(*str++ -'0');
return signal*result;
}
❺ c語言atoi函數源代碼
c語言atoi函數源代絕禪碼:
int atoi(char n[])
{int i,y=0;
for(i=0;n[i]>='0'悔好 && n[i]<='9';i++)
y=y*10+n[i]-'碧宏鉛0';
return y;
}
❻ 如何用c語言實現atoi函數
要善用網路。。。網路就有atoi這個詞條,裡面有c語言實現的源代碼(其實是c++,不過唯一的不同只是它的字元串定義為了const,即常量,表示在函數里不允許改變此字元串內容)
我在這里加上注釋簡單說明一下該源碼
int
my_atoi(const
char
*str){
int
result;
//保存返回結果的
int
signal
=
1;
//保存符號的,默認正數
//判斷第一個數字是否合法
if((*str>='0'&&*str<='9')||*str=='-'||*str=='+'){
//如果是-,符號變為-1,指針右移
//如果是+,指針右移(總之指向了第一個數字)
if(*str=='-'||*str=='+'){
if(*str=='-')
signal
=
-1;
str++;
}
}
else
return
0;//第一個不是+,-或數字,非法返回0
//這里就是轉換,是數學的問題就不解釋了
while(*str>='0'&&*str<='9')
result
=
result*10+(*str++
-'0');
return
signal*result;
}
不過這個程序,如果字元串是非法的話,他也會返回直到非法字元之前的數值
比如123abc
返回值就是123