public static bool IsIpAddress(string address)
        {
            int segment = 0;
            int dotcount = 0;
            for (int i = 0; i < address.Length ;  i++)
            {
                char c = address[i];
                if (c == '.')
                {
                    if (address[i + 1] == '.')
                        // Disallow multiple dots in a row
                        //索引超出数组界限
                        return false;                    if (segment > 255)
                        return false;
                    if (dotcount==0 && segment==0)
                        return false;
                    dotcount++;
                    segment = 0;
                }
                else if (c < '0' || c > '9')
                    return false;
                if (c != '.')
                    segment = segment * 10 + c - '0';
            }
            if (dotcount != 3)
                return false;            if (segment > 255)
                return false;            return true;
        }这是一个IP地址格式判断的代码,但是如果我输入的是已.结尾时如(192.168.1.)就会报这样的错误,求人讲解这是为什么?怎么改正

解决方案 »

  1.   

    if (c == '.')
                    {
                        if (address[i + 1] == '.')
                            // Disallow multiple dots in a row
                            //索引超出数组界限
                            return false;假如:第一个如果等于'.'是最后一位,下面那个if (address[i + 1] == '.')肯定会超出边界的。因为前而那个已经是最后位。
    if (c == '.')
       {
         if ((i+1) == address.Length)
               return false;
      

  2.   

    你必须添加判断是否为合法地址的检查,否则if (address[i + 1] == '.')
    上面这行检查最后一个.的时候,就超出索引了
      

  3.   

    public static bool IsIpAddress(string address)
    {
    if(address.EndsWith(".")) return false;
    }
      

  4.   

    if (address[i + 1] == '.')LZ,这句代码肯定会越界了!!你最后一位是.,那么i+1肯定就越界了撒!!这个,你到底想怎样??不让越界么??那就判断下啊!
      

  5.   


     /// <summary>
            /// 检测串值是否为合法的格式
            /// </summary>
            /// <param name="strRegex">正则表达式</param>
            /// <param name="strValue">要检测的String值</param>
            /// <returns>成功返回true 失败返回false</returns>
    public static bool CheckIsFormat(string strRegex,string strValue)
    {
    if(strValue != null && strValue.Trim() != "")
    {
    Regex re = new Regex(strRegex);
    if (re.IsMatch(strValue))
    {
    return true;
    }
    else
    {
    return false;
    }
    }
    return false;
    }
    调用:
    bool b = CheckIsFormat(@"\d+\.\d+\.\d+\.\d+", "112.23.1.343"); 返回true
    bool b = CheckIsFormat(@"\d+\.\d+\.\d+\.\d+", "112.23.1.");    返回false
      

  6.   

    本帖最后由 net_lover 于 2011-08-18 15:36:44 编辑
      

  7.   

    bool b = CheckIsFormat(@"\d+\.\d+\.\d+\.\d+", "999.23.1.343"); 呢?
      

  8.   

    address最多可以取到address[i]
    address[i + 1]出错
      

  9.   

      public bool IsValidIP(string addr)
      {    string pattern = @"^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$";
        Regex check = new Regex(pattern);
        bool valid = false;
        if (addr == "")
        {
          valid = false;
        }
        else
        {
          valid = check.IsMatch(addr, 0);
        }
        return valid;
      }
      

  10.   

    现用(@"\d[1-3]\.\d[1-3]\.\d[1-3]\.\d[1-3]")正则表达式验证下是否符合基本的ip地址格式,然后再调用你那个函数,Regex re = new Regex(@"\d[1-3]\.\d[1-3]\.\d[1-3]\.\d[1-3]");
    if(!re.IsMath(ipStr)) return false;if (address[i + 1] == '.') 这个在i=address.length的时候就超出索引了,所以会报错