模擬實現atoi
分析: 需要對特殊情況進行處理。
字符轉整數
1. 考慮輸入的字符串是否爲NULL、空字符串
2. 考慮輸入的字符串是否包含正負號
3. 考慮輸入的字符串是否會發生上溢或下溢(正整數的值是0X7FFFFFFF,最小的負整數是0X80000000)
4. 如何區分正常返回數字0和不合法的返回
//模擬實現 atoi
//int atoi( const char *string );
//需要考慮情況5種:1.空指針 2.空字符串 3.空白字符 4.正負號 5.溢出(正負)
enum Status
{
VALID,//合法
INVALID//非法
}; //檢測狀態值,只有一種情況爲合法,其他均爲非法,所以最開始最好初始化爲非法
enum Status status = INVALID;
int my_atoi(const char* str)
{
int flag = 1;//標記正負數
long long ret = 0;//要判斷是否溢出,若定義爲int則永遠也不可能溢出
assert(str);//1.空指針
if(*str == '\0')//2.空字符串
{
return 0;
}
//3.空白字符
while(isspace(*str))
{
str++;
}
//4.+-
if(*str == '+')
{
str++;
}
if(*str == '-')
{
flag = -1;
str++;
}
//正常字符
while(*str)
{
if(isdigit(*str))//1234a5 輸出1234
{
ret = ret * 10 + flag*(*str - '0');
if(ret > INT_MAX || ret < INT_MIN )
{
if(flag == 1)
{
return INT_MAX ;
}
else
{
return INT_MIN ;
}
}
}
else
{
return ret;
}
str++;
}
status = VALID;
return (int)ret;
}
模擬實現 itoa
itoa的模擬實現
該函數的功能是將base進制的整型轉化爲相應字符串
value: 要轉化爲字符串的整型 str: 用存儲轉換的字符串
base: 用於表示作爲字符串的值的數值基數,介於2和36之間,其中10表示十進制,16進制。。
char* itoa(int value, char* str, int base)
{
char* dest = str; //用來記錄字符串的開始
stack<char> tmp;
if(value == 0)//value爲0時的特殊處理
{
*str++ = '0';
*str = '\0';
return dest;
}
//base的範圍爲:[2-36]
if(base < 2 || base > 36)
{
*str = '\0';
return str;
}
int num = 1;
while(num)
{
num = value/base;
int data = value%base; //base從低到高位
if(data < 10 )
{
tmp.push(data+'0');
}
else
{
tmp.push(data-10+'a'); //跳過大寫字母
}
value = num;
}
while(!tmp.empty())
{
*str++ = tmp.top();
tmp.pop();
}
*str = '\0';
return dest;
}