2

私はこれを持っています:

private void getAccount()
{
    string[] acct = File.ReadAllLines(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\Accts.txt");
    for (int i = 0; i < acct[line].Length - 1; i++)
    {
        foreach (char c in acct[line])
        {
            if (c.ToString() == ":")
            {
                onPass = true;
                i += 1;
            }
            if (onPass == false) { user += acct[line][i]; }
            if (onPass == true) { pass += acct[line][i]; }
        }
    }
    MessageBox.Show("Username is " + user + ". \n\nPassword is " + pass + ".");
    onPass = false;
}

ファイルにはこれがあります:

minicl55:mypass

ただし、これはこれを出力します:

ここに画像の説明を入力

これらは次の問題です。

  • キャラクターが何度も繰り返される
  • 「mmmmmmmm」のみがユーザー名の一部と見なされ、コロンまでのすべてがユーザー名の一部である必要があり、その後はパスです
  • : はパスワードに含まれているため、完全に無視する必要があります (ユーザー名の末尾とパスワードの先頭を示す場合を除く)。
4

5 に答える 5

5

forループを初めて通過するときは、 i == 0. 次に、foreachループは の各文字を調べますがacct[line]i変更されることはないため、 の前のすべての文字について:acct[line][i]パーツは を返し続けるacct[line][0]か、または"m"8 回になります。そのため、ユーザー名は"mmmmmmmm".

次に、コロンに遭遇し、i1 増加します。これonPass == trueで、文字 である になります。これが文字列の残りの部分で繰り返されるため、パスは(コロンから末尾まで) あるように見えます。passacct[line][1]"i""iiiiiii"

forループに戻ります。ループ内でExceptiが増加したため (悪い考えです)、ループは実際には on になります。ここでも、最初の部分は 8 回 (ユーザー名の文字ごとに 1 回) 実行されますが、常に を参照するため、ユーザー名は. 例外は依然として真であるため、パスワード変数に追加されます。その後、が増加した後、さらに 7 を取得します。1 fori == 2acct[line][2]"nnnnnnnn"onPass"i"i

i変数は内部およびforループ内で再び増加するため、次に を使用するときはacct[line][4]( "c"8 回)、ループi内で 1 増加し、7 回 (つまり ) になります。foreachacct[line][5]"l"

これまでのところ、パスワードは"iiiiiiinnnnnnnniiiiiiicccccccclllllll". その模様をご覧いただければ幸いです。


ループと複雑さの一部を排除し、次のようなものを使用できます: (未テスト)

private void getAccount()
{
    var allAccounts = File.ReadAllLines(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\Accts.txt");

    foreach (var account in allAccounts)
    {
        var pieces = account.Split(':');

        MessageBox.Show(string.Format("Username is {0}. \n\nPassword is {1}.", pieces[0], pieces[1]));
    }
}
于 2013-08-04T04:20:11.953 に答える
2

charあなたの外側のループは のそれぞれを繰り返していますacct[line]。次に、内側のループで同じことを行います。少し異なる方法で表現します。

于 2013-08-04T04:19:10.457 に答える
1

変数を表示してください。ただし、別のアプローチを次に示します。

       private void getAccount()
        {
            string user = "";
            string pass = "";
            string[] user_pass = new string[0];

            var accts = System.IO.File.ReadAllLines(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + @"\Accts.txt");


            foreach(var acct in accts)
            {
                user_pass = acct.Split(':');
            }


            //Add iteration for multiple lines
            if (user_pass.Length > 0)
            {
                MessageBox.Show("Username is " + user_pass[0] + ". \n\nPassword is " + user_pass[1] + ".");
            }
            else
            {
                MessageBox.Show("Chaos: Dogs and Cats Living Together!");
            }

        }
    }
}
于 2013-08-04T04:32:44.287 に答える
0

さて、あなたの最初のループは、位置がまったく変わらない特定の行の長さを取得していることがわかります。

for (int i = 0; i < acct[line].Length - 1; i++)

そして、その唯一の行のすべての文字をループします

foreach (char c in acct[line])

問題は、acct[line] の長さが X の場合、acct[line] を X 回ループするため、文字が繰り返される理由です。同じ文字を X 回読むことになります。

于 2013-08-04T04:24:01.493 に答える