这是代码:
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。
首先我从textBox中获取所有单词并将它们添加到变量单词中。 然后在循环中首先获取textBox1的内容,直到第一个单词并将其添加到textBox2。
然后我找到第一个单词index然后substring,所以变量s包含单词。 我在争论这个词,然后将这个词添加到textBox2。 这个想法是:
在第一个内容之后添加加扰字。
要添加上次找到的单词中的下一个内容,直到下一个单词。
依此类推,textBox2中的内容与textBox1中的内容格式相同,但textBox2中的单词将被加扰。
问题是当我点击按钮时,它会将很多次内容和单词添加到textBox2中,并且会造成很多混乱。
为什么我该如何解决?
编辑**
当输入手动文本到textBox1时,例如:
? where am i ? ! hello im here -----
_______________
几个人的时间是几点? :&gt;
我开始在几个空格后键入textBox1,然后添加了一些字符 - ? &GT;然后我按了回车键并添加了另一条线。
textBox2中的结果是:
wrhee hlelo hree ----- 的 _ __ _ ___
wht tmie evoyrnee
我需要的词语很好,而且问题在于它没有复制标志?和&gt;并没有复制其他没有被扰乱的内容。单词:是我很少没有复制到textBox2。
我希望将整个内容复制到带有空格的textBox2以及除了我需要加扰的单词之外的所有内容。
争夺部分正在运作但内容副本却没有。
答案 0 :(得分: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
。