字符串转换成整数(微软面试)

要注意以下几点:

一,通过一个全局变量标记传入的指针是否为NULL或者是否含有非法字符或者是否造成int溢出。

二,需要判断是否以+号或者-号开头。

三,在函数内部用long long保存结果,如果有溢出,则结果为0。

四,最后,用static_cast强制转换成int。

 

 

#include <cstring>
#include <iostream>
#include <limits>
using namespace std;
enum Status
{
    Valid = 0,
    Invalid
};
int status = Invalid;                     // 状态初始化
int atoi(const char* str)
{
    int length, i;
    bool positive = true;
    long long ret = 0;
    
    if (str != NULL)                      // 判断NULL
    {
        length = strlen(str);
        i = 0;
        
        if (str[i] == '+')                // 判断正负符号
        {
            i++;
        }
        else if (str[i] == '-')
        {
            positive = false;
            i++;
        }        
        while (i < length)
        {
            if (str[i] >= '0' && str[i] <= '9')                     // 是否含有非法字符
            {
                ret = ret * 10 + str[i] - '0';                
                if (ret > std::numeric_limits<int>::max())          // 判断溢出
                {
                    ret = 0;
                    break;
                }                
                i++;
            }
            else
            {
                ret = 0;
                break;
            }
        }        
        if (i == length)              // 转换过程一切顺利
        {
            status = Valid;
            if (!positive)
            {
                ret = 0 - ret;
            }
        }
    }    
    return static_cast<int>(ret);     // 将long long转换成int,返回结果
}
int main()
{
    char str[255];    
    while(cin.getline(str,255))
    {
        int res=atoi(str);
        cout<<res<<endl;
    }
    return 0;
}
View Code

 

posted @ 2016-12-13 16:00  泡面小王子  阅读(228)  评论(0编辑  收藏  举报