c#防止覆盖文本字段

本文关键字:文本 字段 覆盖 | 更新日期: 2023-09-27 18:17: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);
}

c#防止覆盖文本字段

几点提示:

    你的代码正在修改控件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);

您正在使用uitvoer.Text+=buffer;,我认为这是问题所在。字符数组的类型被赋值为text '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;
}