C#在循环中操作字符串

时间:2016-11-12 17:46:22

标签: c# string foreach

我的项目:基本上,我在研讨会上编写了一个小的加密程序,它接受用户输入并检查循环中的字符位置是否均匀,如果是,它将在字符串的前面,否则在结束。它看起来像这样;

string userInput = "", encodedInput = "", evenChar = "", oddChar = "";
int charCount = 0;

Console.WriteLine("Input your text: ");
userInput = Console.ReadLine();

foreach(char character in userInput)
{
    charCount++;
    if ((charCount % 2) == 0)
    {
        evenChar = evenChar + character;
    }
    else
    {
        oddChar = character + oddChar;
    }
    encodedInput = evenChar + oddChar;
}
Console.WriteLine(encodedInput);

现在这种方式很好,当我输入"我的名字是杰夫!"我得到了" im aei ef!fjs mny h"。

现在我正在尝试编写一个解密循环。我选择用于解密的方法基本上是从字符串中取出最后一个字符,将其添加到一个新的空字符串,然后从字符串中取出第一个字符,并将其添加到相同的空字符串中,然后简单地减少加密的总长度string并增加第一个字符的位置。

char lastChar = ' ';
char firstChar = ' ';
StringBuilder decodedInput = new StringBuilder();

int len = encodedInput.Length;
int len2 = 0;

foreach(char character in encodedInput)
{
    lastChar = encodedInput[len - 1];
    decodedInput.Append(lastChar.ToString());
    len--;

    firstChar = encodedInput[len2];
    len2++;
    decodedInput.Append(firstChar.ToString());
}

Console.WriteLine(decodedInput.ToString());

现在这在大多数情况下工作正常。它需要相同的" im aei ef!fjs mny h"和输出"我的名字是jeff !! ffej si eman ym ih"。它反映了字符串,因为每个循环都会产生字符,所以"我的名字是jeff"变成36个字符。我已经尝试将循环减半,但你仍然会得到一些镜像。

我很清楚有更好或更简单的方法来解读这个,但我想这样做是出于教育目的。

亲切的问候,

Vocaloidas。

1 个答案:

答案 0 :(得分:3)

不要遍历编码输入的每个字符,因为最终会处理每个字符两次。您已使用lenlen2变量在字符串中上下计数,因此如果您将foreach替换为:

while (len > len2)

这只会处理字符串的每个字符

当字符串是奇数个字符以处理中间字符时,即当lenlen2相等时,您将不得不做一些特殊的外壳。为此添加以下内容:

            if (len == len2)
                break;

在循环的中间,以便它变为:

        while (len > len2)
        {
            lastChar = encodedInput[len - 1];
            decodedInput.Append(lastChar.ToString());
            len--;

            if (len == len2)
                break;

            firstChar = encodedInput[len2];
            len2++;
            decodedInput.Append(firstChar.ToString());
        }