天天看點

劍指offer面試題49:把字元串轉為整數

此題并不複雜,主要是想考做題人思維的嚴密性和代碼的健壯性,要想寫出完整的正确的代碼,必須要考慮各種異常的情況,以及設計出足夠多的測試用例以供正确性檢驗,是以可以說也并不簡單,至少剛開始對我來說就是這樣的。

我們主要考慮的是輸入字元串參數存在的各種可能性:

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;
}           

繼續閱讀