2016-07-01 5 views
1

何が起こっているのか分かりません。最近私はthisコードをとり、少し編集しました。私はバグを発見したので、デバッグしようとしましたが、奇妙な動作に遭遇しました。 Somewhy同じ文字で構成される2つの異なるchar配列から作成された2つの文字列は等しくなく、またデバッグ文字列も切り詰められます。文字列自体が魔法にかかっています

using UnityEngine; 
using System.Collections; 
using System.Collections.Generic; 

public class AlphanumericComparer : IComparer<string> 
{ 
    public int Compare(string s1, string s2) 
    { 
     if (s1 == null || s2 == null) 
      return 0; 

     int len1 = s1.Length; 
     int len2 = s2.Length; 
     int i1 = 0; 
     int i2 = 0; 

     while (i1 < len1 && i2 < len2) 
     { 
      char c1 = s1[i1]; 
      char c2 = s2[i2]; 

      char[] chunk1 = new char[len1]; 
      int j1 = 0; 
      char[] chunk2 = new char[len2]; 
      int j2 = 0; 

      do 
      { 
       Debug.Log("1: " + i1 + " _ " + j1 + " _ " + c1); // Seems to be OK. 
       chunk1[j1++] = c1; 
       i1++; 

       if (i1 < len1) 
        c1 = s1[i1]; 
       else 
        break; 
      } while (char.IsDigit(c1) == char.IsDigit(chunk1[0])); 

      do 
      { 
       Debug.Log("2: " + i2 + " _ " + j2 + " _ " + c2); // Seems to be OK. 
       chunk2[j2++] = c2; 
       i2++; 

       if (i2 < len2) 
        c2 = s2[i2]; 
       else 
        break; 
      } while (char.IsDigit(c2) == char.IsDigit(chunk2[0])); 

      string str1 = new string(chunk1); 
      string str2 = new string(chunk2); 
      Debug.Log(str1.CompareTo(str2) + " " + str1 + " " + str2); // "1"?! And also why is string cutted?! 

      int result; 

      if (char.IsDigit(chunk1[0]) && char.IsDigit(chunk2[0])) 
      { 
       result = int.Parse(str1).CompareTo(int.Parse(str2)); 
       //Debug.Log(s1 + " _ " + s2 + " _ " + int.Parse(str1) + " _ " + int.Parse(str2) + " _ " + result);//tmp 
       Debug.Log(string.Format("{0}, {1}, {2}, {3}, {4}", s1, s2, int.Parse(str1), int.Parse(str2), result));//tmp 
      } 
      else 
      { 
       result = str1.CompareTo(str2); 
       //Debug.Log(s1 + " _ " + s2 + " _ " + str1 + " _ " + str2 + " _ " + result);//tmp 
       Debug.Log(string.Format("{0}, {1}, {2}, {3}, {4}", s1, s2, str1, str2, result));//tmp 
      } 

      if (result != 0) 
       return result; 
     } 

     return len1 - len2; 
    } 
} 

すべてのIDEをリロードしようとしましたが、何ももたらされませんでした。私は比較マイ文字列:次の文字列の並べ替え工事のために

string[] test = new string[] { "qwe45", "qwe13a" }; 

期待や行動はなく、cuttedデバッグ文字列のバグを異なるのでまだそこにある:私は

string[] test = new string[] { "qwe45", "qwe13" }; 

何を間違っているのか、私はないです場合は午前、これを回避する方法は?私はこのように分割した場合

また:

UPDATEは

Debug.Log(str1); 
Debug.Log(str2); 

それは正しいものを示しているが、CompareToはまだいくつかのゴミを返します。

+0

「cutted debug string」とはどういう意味ですか? –

+0

@KevinHooke 'Debug.Log(str1.CompareTo(str2)+" "+ str1 +" "+ str2);は' 0 qwe qwe'を返しますが、 '1 qwe'を返します。そして、 'Debug.Log(string.Format(" {0}、{1}、{2}、{3}、{4} "、s1、s2、str1、str2、result));' 'qwe13a 、qwe45、qwe、qwe、0'を返すが、 'qwe13a、qwe45、qwe'を返す。 – Necronomicron

+0

私にはいいようです。ここで出力を確認してくださいhttps://dotnetfiddle.net/QqbTcd – failedprogramming

答えて

3

私はコードが達成しようとしていることを理解するのに苦労しますが、あなたの宣言char[] chunk1 = new char[len1];は1文字が短すぎる変数を作成するようです。

len1は、最初の入力文字列の長さ(例:"qwe45")です。 chunk14つのテキストの文字プラス0

を終了することができますメモリ空間の5つの文字を、持っていますので、その後、あなたはstr1が今1つの文字短くなりますことを意味し、string str1 = new string(chunk1);str1にコピーします。あなたは欠けているのではないでしょうか?

+0

Omg、そうです。配列をリストに変更しました。これは、あなたが誰かのコードを選んだときに起こることです...間違ってはいけません。私がコピーしたものをチェックしましたが、何とか '\ 0'のことを忘れました。 – Necronomicron

+0

しかし、なぜそれが[ここ](https://dotnetfiddle.net/QqbTcd)で動作するのだろうか。 Unity(部分的に?)はC++を使用していますが、これが理由です。 – Necronomicron

関連する問題