zoukankan      html  css  js  c++  java
  • 库函数atoi

    函数名:atoi

    功能: 把一个字符串转换成一个整数。

    看似简单,主要是情况太多,需要注意考虑。

    测试代码:

    Test(NULL);
    Test("");
    Test("123");
    Test("+123");
    Test("-123");
    Test("1a33");
    Test("+0");
    Test("-0");
    //有效的最大正整数, 0x7FFFFFFF
    Test("+2147483647");    
    Test("-2147483647");
    Test("+2147483648");
    //有效的最小负整数, 0x80000000
    Test("-2147483648");    
    Test("+2147483649");
    Test("-2147483649");
    Test("+");
    Test("-");

    详细代码

    #pragma once
    
    long long StrToIntCore(const char* str, bool minus);
    
    enum Status 
    { 
    	kValid = 0,//合法输入
    	kInvalid   //非法输入
    };
    
    int g_nStatus = kValid;    //一个全局状态控制,初始化为合法
    
    int StrToInt(const char* str)
    {
    	g_nStatus = kInvalid;  //非法
    	long long num = 0;     //装最后返回的整数结果
    
    	if (str != NULL && *str != '')
    	{
    		bool minus = false;//是不是负号,初始化为不是
    		if (*str == '+')   //考虑正号
    			str++;
    		else if (*str == '-')
    		{
    			str++;
    			minus = true;  //是负号,minus置为真
    		}
    
    		if (*str != '')  
    		{
    			num = StrToIntCore(str, minus);
    		}
    	}
    
    	return (int)num;
    }
    
    long long StrToIntCore(const char* digit, bool minus)
    {
    	long long num = 0;
    
    	while (*digit != '')              //正负号处理完成
    	{
    		if (*digit >= '0' && *digit <= '9')
    		{
    			int flag = minus ? -1 : 1;  //整正负结果
    			num = num * 10 + flag * (*digit - '0');
    
    			if ((!minus && num > 0x7FFFFFFF)                //正数最大
    				|| (minus && num < (signed int)0x80000000)) //负数最小
    			{
    				num = 0;
    				break;
    			}
    
    			digit++;
    		}
    		else                            //出现非法字符
    		{
    			num = 0;
    			break;
    		}
    	}
    
    	if (*digit == '')                 //这种‘’为合法
    	{
    		g_nStatus = kValid;
    	}
    
    	return num;
    }
    
    
    void Test(char* string)
    {
    	int result = StrToInt(string);
    	if (result == 0 && g_nStatus == kInvalid)
    		printf("the input %s is invalid.
    ", string);
    	else
    		printf("number for %s is: %d.
    ", string, result);
    }
    
    void _Test()
    {
    	Test(NULL);
    
    	Test("");
    
    	Test("123");
    
    	Test("+123");
    
    	Test("-123");
    
    	Test("1a33");
    
    	Test("+0");
    
    	Test("-0");
    
    	//有效的最大正整数, 0x7FFFFFFF
    	Test("+2147483647");
    
    	Test("-2147483647");
    
    	Test("+2147483648");
    
    	//有效的最小负整数, 0x80000000
    	Test("-2147483648");
    
    	Test("+2147483649");
    
    	Test("-2147483649");
    
    	Test("+");
    
    	Test("-");
    }

    分析

    1.有几种情况都是返回零,但是需要知道分别是什么情况,就用一个全局量g_nStatus去控制,是合法零还是非法零
    2.minus控制整数的正负,true就是负号;
    3.是非法输入,都有g_nStatus状态控制,在输出的时候,判断输出零时,g_nStatus的状态;

    测试结果:



    赐教!
  • 相关阅读:
    SPOJ 8093 JZPGYZ
    UVA1030 Image Is Everything
    UVA11996 Jewel Magic
    UVA11922 Permutation Transformer
    UVA1479 Graph and Queries
    P3224 [HNOI2012]永无乡
    UVA11020 Efficient Solutions
    UVA12206 Stammering Aliens
    UVA11107 Life Forms
    UVA11019 Matrix Matcher
  • 原文地址:https://www.cnblogs.com/melons/p/5791819.html
Copyright © 2011-2022 走看看