0

我想制作一个随机“密码”生成器,生成不同长度的字母。您输入长度,它会生成长度随机字符。我还希望将一些随机字母大写。我有一个变量 rndCap,它是 1 或 2。如果 rndCap == 2,if 将把它变成一个大写字母,如果不是,它什么也不做。答案是所有字符组合在一起。当我执行时,数字都是小写的。一切正常,除了它随机大写一个字符。

Random rnd = new Random();

string[] alphabet = new string[27];

alphabet[1] = "a";
alphabet[2] = "b";
alphabet[3] = "c";
alphabet[4] = "d";
alphabet[5] = "e";
alphabet[6] = "f";
alphabet[7] = "g";
alphabet[8] = "h";
alphabet[9] = "i";
alphabet[10] = "j";
alphabet[11] = "k";
alphabet[12] = "l";
alphabet[13] = "m";
alphabet[14] = "n";
alphabet[15] = "o";
alphabet[16] = "p";
alphabet[17] = "q";
alphabet[18] = "r";
alphabet[19] = "s";
alphabet[20] = "t";
alphabet[21] = "u";
alphabet[22] = "v";
alphabet[23] = "w";
alphabet[24] = "x";
alphabet[25] = "y";
alphabet[26] = "z";

string answer = "";
int length = Convert.ToInt32(lengthTextBox.Text);
int rndCap;
int rndLetter;

for (int i = 1; i <= length; i++)
{
    rndCap = rnd.Next(1, 3);
    rndLetter = rnd.Next(1, 27);
    string tempMem = alphabet[rndLetter];

    if (rndCap == 2)
    {
        tempMem.ToUpper();
    }
    answer = answer + tempMem;
}

passwordTextBox.Text = answer;
4

7 回答 7

10

我很确定 IF 正在工作:)

String.ToUpper()但是不会将手头的字符串更改为大写,而是将其作为结果返回。您必须分配值。你想要的可能是这样的:

tempMem = tempMem.ToUpper();

此外,要遵循的规则:始终牢记, 编码、文化和语言环境可能与您当前的不同。

即使在这种情况下,我们只使用“无害”的 ASCII 字符,但要使用大写字符串将其转化为实践:

正如 Jeppe 所指出的:在土耳其语环境中,i 大写为与 I 不同的字符 - 引入了不需要的后果。

于 2013-09-06T20:43:21.770 回答
3

字符串是immutable所以你需要再次分配它

tempMem = tempMem.ToUpper();
于 2013-09-06T20:43:24.533 回答
1

您调用 ToUpper,但不分配值:

tempMem = tempMem.ToUpper()

也许这段代码通常更优雅:

    static void Main(string[] args)
    {
        Random cRandom = new Random(DateTime.Now.Millisecond);

        string answer = "";
        int length = Convert.ToInt32(6);
        int rndCap;
        int rndLetter;

        for (int i = 1; i <= length; i++)
        {

            rndCap = cRandom.Next(1, 3);

            rndLetter = cRandom.Next(0, 26);

            char tempMem = (char)('a' + rndLetter);
            string c2 = tempMem.ToString();
            if (rndCap == 2)
            {

               c2 = tempMem.ToString().ToUpper();

            }

            answer = answer + c2;

        }
        Console.WriteLine(answer);
        Console.ReadLine();
    }
于 2013-09-06T20:46:17.273 回答
0

我认为有更简单的方法来执行您想要实现的目标。看看这段代码;

        var lowerchar = "abcdefghijklmnopqrstuvwxyz";
        var upperchar = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        var numbers = "0123456789";
        var random = new Random();

        var result = new string(
            Enumerable.Repeat(lowerchar, 3)
                      .Select(s => s[random.Next(s.Length)])
                      .ToArray());

        result += new string(
            Enumerable.Repeat(upperchar, 3)
                      .Select(s => s[random.Next(s.Length)])
                      .ToArray());

         result += new string(
            Enumerable.Repeat(numbers, 2)
                      .Select(s => s[random.Next(s.Length)])
                      .ToArray());

        random = new Random();

        string password = new string(result.ToCharArray().OrderBy(s => random.Next().ToArray());
于 2013-09-06T20:47:47.870 回答
0

所有字符串操作都返回新字符串并且不修改原始字符串,因为字符串是不可变的。像这样修改它: tempMem = tempMem.ToUpper();

于 2013-09-06T20:47:54.523 回答
0

用这个:

tempMem = tempMem.ToUpper();

由于ToUpper()不会对调用它的字符串进行大写,因此它返回此字符串的副本,其中所有字母都大写。

于 2013-09-06T20:43:37.470 回答
0

ToUpper()是一种返回大写字符串的方法,因此您需要将 tempMem 的值分配给该值:

tempMem = tempMem.ToUpper();
于 2013-09-06T20:44:55.860 回答