你會(huì)寫“atoi”嗎???
來源:程序員人生 發(fā)布時(shí)間:2016-06-16 08:18:34 閱讀次數(shù):2821次
分析:
1、如果輸入的字符包括不是數(shù)字字符的字符???
例如:“123adc4".
針對(duì)這類情況,我們只要加上判斷就好了,只要遇到不是數(shù)字字符的直接返回。
2、如果在數(shù)字字符前面有正負(fù)號(hào)又該怎樣辦???
例如:”⑴23”、“+123”.
針對(duì)這類情況,我們?cè)偌由吓袛啵袛嘧址牡?個(gè)字符是否是正負(fù)號(hào),并用1個(gè)標(biāo)記位flag記錄正負(fù)。
3、當(dāng)輸入的字符串前面幾個(gè)字符都是空格又該怎樣辦???
例:“ ⑴23”,“ +123”.
針對(duì)這類情況,庫里面的atoi是將空格跳過再進(jìn)行判斷的,所以我們?cè)?開始就用循環(huán)將空格跳過,注意這時(shí)候候要是字符串里面全部是空格,則我們應(yīng)當(dāng)返回1個(gè)值,就返回0吧。
4、當(dāng)輸入的字符串中沒有數(shù)字時(shí),我們應(yīng)當(dāng)返回甚么呢???
我們?cè)谶@類情況下返回0.
5、當(dāng)字符串中的字符數(shù)字轉(zhuǎn)化的整數(shù)太大,會(huì)有可能溢出???
針對(duì)這類情況,我們需要做出1個(gè)判斷,判斷轉(zhuǎn)化后的數(shù)字當(dāng)它的范圍在long的范圍內(nèi)。
那末最重要的1個(gè)問題來了,當(dāng)你第3、4中情況下,返回的是0,如果輸入“0”返回的也是0,這兩個(gè)0怎樣辨別呢???,貌似在這里你把3、4兩種情況下的返回值設(shè)置成甚么都不適合。所以我們可以設(shè)置1個(gè)全局變量state,來記錄是否是正常返回。
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
enum State
{
NORMAL, //正常
ABNORMAL //異常
}state;
state = ABNORMAL; //將初始狀態(tài)置為異常
int my_atoi(const char *src)
{
assert(src);
int flag = 1;
long long ret = 0;
while (*src==' ') //跳過空格
{
src++;
}
if (*src == '\0') //如果這時(shí)候候字符串已完了,則直接返回
{
return 0;
}
if (*src == '+') //接下來判斷正負(fù)
{
src++;
}
else if (*src == '-')
{
flag = ⑴;
src++;
}
while (*src >= '0'&&*src <= '9') //讀取字符數(shù)字轉(zhuǎn)換成整型
{
ret = ret * 10 + flag*(*src-'0');
if (ret >= INT_MAX|| ret <= INT_MIN) //如果溢出的話直接跳出
{
break;
}
src++;
}
if (*src == '\0') //正常返回
state = NORMAL; //將狀態(tài)置為正常
return (int)ret;
}
int main()
{
char arr[50] = { 0 };
scanf("%s", arr);
int ret=my_atoi(arr);
if (state == ABNORMAL)
printf("異常返回\n");
printf("%d\n", ret);
system("pause");
return 0;
}
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)