此題并不複雜,主要是想考做題人思維的嚴密性和代碼的健壯性,要想寫出完整的正确的代碼,必須要考慮各種異常的情況,以及設計出足夠多的測試用例以供正确性檢驗,是以可以說也并不簡單,至少剛開始對我來說就是這樣的。
我們主要考慮的是輸入字元串參數存在的各種可能性:
1、輸入的字元串是正數(’+’)、負數(’-‘)和0(’0’);
2、超過最大的正數(2^31-1),小于最小的負數(-2^31);
3、輸入的字元串是NULL、空串、含有非法的字元。
“limits.h”
#define SHRT_MIN (-32768)
#define SHRT_MAX 32767
#define USHRT_MAX 0xffff
#define INT_MIN (-2147483647 - 1)
#define INT_MAX 2147483647
#define UINT_MAX 0xffffffff
代碼實作:
#include <iostream>
#include <limits.h>
using namespace std;
//用來辨別目前字元串是否是合法的數字,是則為,不是為
int tag = 1;
int StrToInt(const char* str)
{
tag = 0;//初始将認為字元串是非法的
long long num = 0;//防止整型越界
if (str != NULL && *str != '\0')//字元串不能為NULL,且不能為空串
{
bool minus = false;
if (*digit == '+')//第一個字元是+
{
++str;
}
else if(*digit == '-')//第一個字元是-,将minus置為true,表示是負數
{
minus = true;
++str;
}
const char* digit = str;
while (*digit != '\0')
{
int flag = minus ? -1 : 1;//求出正負号
if (*digit >= '0' && *digit <= '9')//目前字元可以轉為數字
{
num = num * 10 + flag * (*digit - '0');//儲存結果
if((!minus && num > 0x7FFFFFFF) || (minus && num < (int)0x80000000))//判斷是否超越整型的邊界
{
num = 0;
break;
}
++digit;
}
else//如果有非法字元
{
num = 0;
break;
}
}
if (*digit == '\0')//周遊到字元串結束字元,則說明該字元串可以轉為合法的int,則将tag置為
{
tag = 1;
}
}
return (int)num;//傳回時強轉為int
}
int main()
{
// char* str = "-123";
// char* str = "+123";
// char* str = "-2147483649";
// char* str = "2147483648";
// char* str = "";
// char* str = NULL;
// char* str = "0";
char* str = " ";
int num = StrToInt(str);
cout << num << endl;
cout << tag << endl;
//cout << INT_MIN << endl;
//cout << INT_MAX << endl;
return 0;
}