【问题标题】:C# prevent overwriting text fieldC#防止覆盖文本字段
【发布时间】:2013-06-06 08:02:39
【问题描述】:

我在 C# 中有此代码,但是用于在块内移动的代码会覆盖用于移动 d 字母的代码。我该如何解决这个问题,以便它们不再相互覆盖? 这是代码:

private void Crypt(int n, int m, int d)
{
    // make a block from the string
    string invoerstring = invoer.Text;
    uitvoer.Text = invoerstring;

    // shift d letters
    char[] buffer = invoerstring.ToCharArray();
    for (int i = 0; i < buffer.Length; i++)
    {
        // Letter.
        char letter = buffer[i];
        // Add shift to all.
        letter = (char)(letter + d);
        // Subtract 26 on overflow.
        // Add 26 on underflow.
        if (letter > 'z')
        {
            letter = (char)(letter - 26);
        }   
        else if (letter < 'a')
        {
            letter = (char)(letter + 26);
        }
        // Store.
        buffer[i] = letter;
    }
    uitvoer.Text+=buffer;

    //shift characters inside a block
    var shift = String.Concat(invoerstring.Skip(m).Concat(invoerstring.Take(m)));
    uitvoer.Text = shift;  
}

private void button1_Click(object sender, EventArgs e)
{
        Crypt(8,2,1);
}

【问题讨论】:

  • 您将值分配给uitvoer.Text 两次。所以最后一个值是不变的。你在寻找什么结果?
  • 我知道我给 uitvoer.Text 赋值了两次。我希望两个值都被坚持,然后我得到了我正在寻找的结果。我该怎么做?
  • @Sybren:嗨,我想知道你的进展如何 :)

标签: c# encryption overwrite


【解决方案1】:

您正在使用uitvoer.Text+=buffer;,我认为这是问题所在。 char 数组的类型在这里被指定为文本“System.Char[]”。

以下修改后的代码将每个字符替换为下一个第 d 个字符(因此 'a' 被 'b' 替换),然后将字符向左旋转 m 个字符。

例如'abcde' 的输入给出了 m = 2 和 d = 1 的 o/p 'defbc' [abcde -> bcdef(替换为下一个字符)-> defbc(左移2)]

private static void Crypt(int n, int m, int d)
{
    // make a block from the string
    string invoerstring = invoer.Text;
    string uitv = "";

    // shift d letters
    char[] buffer = invoerstring.ToCharArray();
    for (int i = 0; i < buffer.Length; i++)
    {
        // Letter.
        char letter = buffer[i];
        // Add shift to all.
        letter = (char)(letter + d);
        // Subtract 26 on overflow.
        // Add 26 on underflow.
        if (letter > 'z')
        {
            letter = (char)(letter - 26);
        }
        else if (letter < 'a')
        {
            letter = (char)(letter + 26);
        }
        // Store.
        buffer[i] = letter;
        uitv += letter;
    }

    //shift characters inside a block
    var shift = String.Concat(uitv.Skip(m).Concat(uitv.Take(m)));
    uitv = shift;
    uitvoer.Text = uitv;
}

【讨论】:

  • -1 到目前为止 - 虽然它可能是海报问题的工作代码,但它不是 SO 的好格式。在没有任何解释或 cmets 的情况下发布代码和答案墙不会为 OP 和未来的读者提供良好的价值。
  • 尝试了上面的代码,但结果与我自己的代码相同。字符在块内移动,但字母不移动。例如,当 d = 1 时,a 必须变为 b。
  • @Sybren - 编辑了我的答案。请现在检查这是否是需要的。阿列克谢——我同意。我应该添加更多的文字。
【解决方案2】:

一些提示:

  • 您的代码正在修改控件Uitvoer。尝试强制阻止这种情况。将 UI 代码(修改 UI 组件)与逻辑(加密某些东西)分开。它认为仅凭此提示您就应该成功,因为现在您正试图将结果写回早期。
  • 您自己说过:第二个操作会覆盖第一个操作的结果。移动块的行使用invoerstring,但invoerstring 没有被移动字母的代码以任何方式修改。您应该使用上一次操作的结果:buffer
  • 我是否更正了参数n 从未使用过?

试试这个:

private string Crypt(string input, int m, int d)
{
    string result = "";
    foreach(char ch in input)
    {
        // Add shift to all.
        char letter = (char)(ch + d);
        // Subtract 26 on overflow.
        // Add 26 on underflow.
        if (letter > 'z')
        {
            letter = (char)(letter - 26);
        }   
        else if (letter < 'a')
        {
            letter = (char)(letter + 26);
        }
        // Store.
        result += letter;
    }

    //shift characters inside a block
    result = result.Substring(m) + result.Substring(0, m);
    return result;  
}

private void button1_Click(object sender, EventArgs e)
{
    uitvoer.Text = Crypt(invoer.Text, 2, 1);
}

如果您希望同时显示块移位和字符移位:在最后一行添加+

result += result.Substring(m) + result.Substring(0, m);

【讨论】:

  • 试过这个,我认为foreach(输入中的聊天字母)必须是foreach(输入中的字符字母)。当我改变这个时,我得到了 3 次相同的错误:无法分配给“字母”,因为它是一个“foreach 迭代变量”
  • @Sybren:你是对的。我急忙输入了答案。我调整了答案。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-26
  • 1970-01-01
  • 2015-08-26
  • 2014-05-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多