zoukankan      html  css  js  c++  java
  • [算法练习] 把字符串转换成整数

    题目说明:

    输入一个表示整数的字符串,把该字符串转换成整数并输出。例如输入字符串"345",则输出整数345。

    程序代码:

    #include <gtest/gtest.h>
    using namespace std;
    
    int StrToInt(const char* szValue, int nBase = 0, bool* bValid = NULL)
    {    
        long long nValue = 0;
        int nSign = 1;
        
        if (bValid)
        {
            *bValid = false;
        }
    
        if (!szValue)
        {
            return 0;
        }
    
        if (nBase < 0 || nBase == 1 || nBase > 36)
        {
            return 0;
        }
    
        char cData = *szValue++;
        while(cData <= ' ')            // skip whitespace
        {
            cData = *szValue++;
        }
    
        if (cData == '+')
        {
            cData = *szValue++;
        }
        else if(cData == '-')
        {
            cData = *szValue++;
            nSign = -1;
        }
    
        if (nBase==0)
        {
            if (cData != '0')
                nBase = 10;
            else if (*szValue == 'x' || *szValue == 'X')
                nBase = 16;
            else
                nBase = 8;
        }
    
        if (nBase == 16)
        {
            if (cData == '0' && (*szValue == 'x' || *szValue == 'X'))
            {
                szValue++;
                cData = *szValue++;
            }
        }
    
        while (cData != '')
        {
            int nData = 0;
            if (cData >= '0' && cData <= '9')
            {            
                nData = cData-'0';
            }
            else if (cData >= 'A' && cData <= 'Z')
            {
                nData = cData - 'A' + 10;
            }
            else if(cData >= 'a' && cData <= 'z')
            {
                nData = cData - 'a' + 10;
            }
            else
            {
                break;
            }
            
            if (nData >= nBase) // bad digit
            {
                break;
            }
    
            nValue = (nBase * nValue) + nData;        
            if (nValue > std::numeric_limits<int>::max())
            {
                nValue = 0;
                break;
            }
    
            cData = *szValue++;
        }
            
        if (bValid)
        {
            *bValid = (cData == '');
        }
        
        return (int)(nSign * nValue);
    }
    
    TEST(Pratices, tStrToInt)
    {    
        // NULL -> 0
        // ""  -> 0    
        // "0" -> 0
        // "+123" -> 123
        // "-123" -> -123
        // "123" -> 123
        
        ASSERT_EQ(StrToInt(NULL), 0);
        ASSERT_EQ(StrToInt(""), 0);
        ASSERT_EQ(StrToInt("0"), 0);
        ASSERT_EQ(StrToInt("+123"), 123);
        ASSERT_EQ(StrToInt("-123"), -123);
        ASSERT_EQ(StrToInt("123"), 123);
    
        // 16进制
        // 0x10 -> 16
        // 0x0 -> 0
        // 0x123 -> 291
        ASSERT_EQ(StrToInt("0x10"), 16);
        ASSERT_EQ(StrToInt("0x10",16), 16);
        ASSERT_EQ(StrToInt("0x0",16), 0);
        ASSERT_EQ(StrToInt("-0x123"), -291);
        
        // 8进制
        // 010 -> 8    
        // 0123 -> 83
        ASSERT_EQ(StrToInt("010"), 8);
        ASSERT_EQ(StrToInt("0123",8), 83);
    
    }
  • 相关阅读:
    CSS的display小记
    Oracle PL/SQL中的循环处理(sql for循环)
    Windows下Git服务器搭建及使用过程中的一些问题
    IIS故障问题(Connections_Refused)分析及处理
    [转载]Function.apply and Function.call in JavaScript
    CentOS中文乱码问题的解决方法
    sed之G、H、g、h使用
    Linux命令:chgrp chown chmod
    javascirpt倒计时
    linux:sed高级命令之n、N
  • 原文地址:https://www.cnblogs.com/Quincy/p/4870814.html
Copyright © 2011-2022 走看看