atoi函數要求
我所實現的atoi函數有以下幾個要求:
1,這個函數需要丟棄之前的空白字符,直到找到第一個非空白字符。之後從這個字符開始,選取一個可選的正號或者符號後面跟隨儘可能多的數字,並將其解釋爲數字的值。
2,字符串可以在形成整數的字符後包括多餘的字符,將這些字符忽略,這些字符對於函數的行爲沒有影響。
3,如果字符串中的第一個非空白的字符不是有效的整數,或者沒有這樣的序列存在,字符串爲空或者只包含空白字符則不進行轉換。
4,如果不能執行有效的轉換,則返回 0。如果正確的值超過的可表示的範圍,則返回INT_MAX(2147483647)或 INT_MIN(-2147483648)。
小碼哥要開始碼代碼啦!!!
#include<stdio.h>
#define INT_MAX 2147483647
#define INT_MIN -2147483678
//兩個宏定義代表整型的邊界值
long long strtoi(char *str,bool minus); //該處爲strtoi函數的聲明,定義成longlong類型,是爲了判斷比整型邊界值更大和更小的值。
//該函數主要用於判斷非空格首字符,接收遍歷函數strtoi所傳回來的整型值
int my_atoi(const char *str)
{
int num = 0;//num用來表示所轉換後的整數值
if(str != NULL && *str != '\0')//等於NULL直接返回0
{
while(*str == ' ')//如果首字符是空格,那就接着向後遍歷,直到找到第一個非空格的字符
{
++str;
continue;
}
bool minus = false;//設置一個標誌,來判斷該數的正負
if(*str == '+')
{
++str;
}
else if(*str == '-')
{
++str;
minus = true;//true代表該數爲負數
}
if(*str != '\0')
{
num = strtoi(str,minus);
}
}
return num;
}
//strtoi函數時遍歷其餘所有的字符
long long strtoi(const char *str,bool minus)
{
long long num = 0;
while(*str != '\0')
{
if(*str >=0 && *str <= 9)//0-9爲合法數字
{
int flag = minus ? -1 : 1; //代表該值的正負
num = num * 10 + flag * (*str - '0');//將字符轉換爲相應的數字
if(!minus && num > 0x7FFFFFFF)//整型最大值2的31次方-1
{
return INT_MAX;
}
else if(minus && num < (signed int)0x80000000)//整型最小值-2的31次方
//由於整型默認爲無符號整型,所有比較負數大小時,要強轉爲有符號整型
{
return INT_MIN;
}
++str;
}
else //遇到非法字符直接結束循環,返回當前的num
{
break;
}
}
return num;
}
int main()
{
char str[100] = {0};
scanf("%s",str);
int k = my_atoi(str);
printf("%d\n",k);
return 0;
}
測試用例
測試用例還有很多,由於考慮到大家的觀賞性,小碼哥就舉了這四類,大家可以自己去多測幾組。
atoi函數的實現就到這裏,碼友們有什麼問題可以給小碼哥我留言,我會及時解決大家的問題。
碼完,收工啦。