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

但是,这会输出:

在此处输入图像描述

这些是以下问题:

  • 字符重复很多
  • 只有“mmmmmmm”被认为是用户名的一部分,直到冒号之前的所有内容都应该是用户名的一部分,之后是通过
  • : 包含在密码中,应该完全忽略它(除了告诉用户名在哪里停止和密码从哪里开始)
4

5 回答 5

5

第一次通过for循环时,i == 0. 然后foreach循环查看 中的每个字符acct[line],但从i不改变,因此对于 之前的所有字符:,该acct[line][i]部分一直返回acct[line][0],或"m"8 次。这就是为什么用户名似乎是"mmmmmmmm".

然后遇到冒号并i加 1。现在onPass == true,sopass结束了acct[line][1],这就是字符"i"。这对字符串的其余部分重复,所以 pass 似乎是"iiiiiii"(从冒号到结尾)。

现在我们回到for循环。除了在循环内部i增加了(坏主意),所以现在循环实际上是 on 。开始部分再次执行 8 次(用户名中的每个字符执行一次),但始终引用,因此用户名是. 除了仍然是真的,所以它被附加到密码变量。然后你得到 7 更多的后增加。1 fori == 2acct[line][2]"nnnnnnnn"onPass"i"i

变量在i内部和for循环中再次增加,所以下次你使用acct[line][4]时,即"c"(8 次),然后i在循环内增加 1 foreach,你得到acct[line][5]7 次,即"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

您的外部循环正在遍历每个charin 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 回答
0

正如其他人评论/回答的那样,您的外部和内部循环几乎在做完全相同的事情。我重写了 for 循环,因此外部循环遍历字符串数组的每一行,然后内部循环将遍历该行中的所有字符。

            for (int line = 0; line < acct.Length; line++)
            {
                int i = 0;
                foreach (char c in acct[line])
                {
                    if (c.ToString() == ":")
                    {
                        onPass = true;
                    }
                    else
                    {
                        if (!onPass)
                            user += acct[line][i];
                        else
                            pass += acct[line][i];
                    }
                    i++;
                }
            }

但是,为了您自己的利益,我确实建议,如果您确实需要遍历所有字符以将其用于内部循环:

            for (int i = 0; i < acct[line].Length; i++)
            {
                if (acct[line][i].ToString() == ":")
                {
                    onPass = true;
                }
                else
                {
                    if (!onPass)
                        user += acct[line][i];
                    else
                        pass += acct[line][i];
                }
            }

或者更好的是用更简单的东西替换所有东西,并且不太容易被小改动破坏:

        for (int line = 0; line < acct.Length; line++)
        {
            if (acct[line].Contains(":"))
            {
                string[] parts = acct[line].Split(':');
                user = parts[0];
                pass = parts[1];
                MessageBox.Show("Username is " + user + ". \n\nPassword is " + pass + ".");
            }
        }
于 2013-08-04T04:27:26.877 回答