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);
    
    }
  • 相关阅读:
    Spark学习笔记2(spark所需环境配置
    Spark学习笔记1(初始spark
    zookeeper基本讲解及基本命令和配置 (转)
    计算机网络面试常考(转载)
    C++面试笔试题汇总
    复杂指针解析
    如何限制一个类对象只在栈(堆)上分配空间?
    虚函数实现机制
    C++内存分配方式详解
    C++中指针和引用的区别(转载)
  • 原文地址:https://www.cnblogs.com/Quincy/p/4870814.html
Copyright © 2011-2022 走看看