0

这是代码:

private void BtnScrambleText_Click(object sender, EventArgs e)
        {
            textBox1.Enabled = false;
            BtnScrambleText.Enabled = false;
            StringBuilder sb = new StringBuilder();
            var words = textBox1.Text.Split(new char[] { ' ', '"', ',', '-', '>', '\r', '\n', ':', '.', '<', '/', '=', '\\' }, StringSplitOptions.RemoveEmptyEntries);
            int index = 0;
            int nextIndex = 0;
            for (int i = 0; i < words.Length; i++)
            {
                string word = words[i];
                int wordWidth = word.Length;
                index = textBox1.Text.IndexOf(word, index);
                string t = textBox1.Text.Substring(nextIndex, index);
                textBox2.AppendText(t);
                string s = textBox1.Text.Substring(index, wordWidth);
                if (index == -1) break;

                if (word.Length > 0)
                {
                    ScrambleTextBoxText scrmbltb = new ScrambleTextBoxText(s.Trim());
                    scrmbltb.GetText();
                    sb.Append(word.Replace(s.Trim(), scrmbltb.scrambledWord));
                    textBox2.AppendText(sb.ToString());
                }

            }
        }

我知道还有其他方法,但我想使用 indexof 和 substring。

首先我从文本框中获取所有单词并将它们添加到变量单词中。然后在循环中首先获取textBox1的内容直到第一个单词并将其添加到textBox2。

然后我找到第一个单词索引,然后是子字符串,所以变量 s 包含单词。我打乱了这个词,然后将这个词添加到 textBox2。这个想法是:

  1. 添加内容直到第一个单词。
  2. 在第一个内容之后添加打乱的单词。

  3. 从最后一个找到的单词添加下一个内容,直到下一个单词。

  4. 在最后一个位置最后索引下一个加扰的单词。

依此类推,最后 textBox2 中的内容将与 textBox1 中的格式相同,但 textBox2 中的单词将被打乱。

问题是当我单击按钮时,它会多次将内容和单词添加到 textBox2 并造成很多混乱。

为什么那我该如何解决?

编辑**

例如,在向 textBox1 输入手动文本时:

    ? where am i ? ! hello im here -----
     _______________

大家好,几点钟了?: >

我在几个空格后开始输入 textBox1 然后添加了一些字符,例如 - ?> 然后我按下回车键并添加了另一行。

textBox2 中的结果是:

wrhee hlelo hree ----- _ __ _ ___

waht tmie evoyrnee

我需要的单词被打乱了,问题是它没有复制标志?并且 > 并且它没有复制其余未被加扰的内容。话:是少数我喜没有复制到textBox2。

我希望将整个内容复制到带有空格和所有内容的 textBox2,但只有我需要加扰的单词。

打乱部分正在工作,但内容副本没有。

4

1 回答 1

1

这两行是罪魁祸首:

string t = textBox1.Text.Substring(nextIndex, index);
textBox2.AppendText(t);

你永远不会设置nextIndex任何东西。所以本质上它是一个常数零,你在开始时设置它。Substring(0,index)意味着每次您将整个内容从零添加到您找到的单词。它读取nextIndex长度index,而不是位置index

尝试用以下内容替换这两行:

string t = textBox1.Text.Substring(nextIndex,index-nextIndex);//index-nextIndex is the length
nextIndex = index;
textBox2.AppendText(t);

编辑:所以我实际上做了一些测试,并想出了这个答案:

StringBuilder sb = new StringBuilder();
var words = textBox1.Text.Split(new char[] { ' ', '"', ',',etc. },
    StringSplitOptions.RemoveEmptyEntries);
int index = 0;
int prevIndex = 0;
int prevWordWidth = 0;//This variable is now kept across iterations
for (int i = 0; i < words.Length; i++)
{
    string word = words[i];

    //The non-scrambled string is from end of last word (prevIndex+prevWordWidth) 
    //up to the next word (index)
    index = textBox1.Text.IndexOf(word, prevIndex+prevWordWidth);
    string t = textBox1.Text.Substring(prevIndex+prevWordWidth, index-(prevIndex+prevWordWidth));

    prevIndex = index;
    prevWordWidth = word.Length;

    sb.Append(t);
    string s = textBox1.Text.Substring(index, prevWordWidth);
    if (index == -1) break;

    if (word.Length > 0)
    {
        ScrambleTextBoxText scrmbltb = new ScrambleTextBoxText(s.Trim());
        scrmbltb.GetText();
        sb.Append(word.Replace(s.Trim(), scrmbltb.scrambledWord));             
    }

}
textBox2.Text = sb.ToString(); //Note how this is only set at the end.

我上面提到的那些行仍然是罪魁祸首,而且在循环的每次迭代中,您都将字符串生成器附加到文本框。字符串构建器的重点(至少我是这么认为的)是在迭代中构建字符串,然后一次将其全部添加到文本框。所以你只想textBox2.Text在最后设置。

于 2013-07-04T23:46:02.863 回答