首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当试图删除一个字符时,被困在无限循环中

当试图删除一个字符时,被困在无限循环中
EN

Stack Overflow用户
提问于 2019-07-27 21:32:38
回答 2查看 200关注 0票数 1

我正在做一个项目,把英语翻译成猪拉丁语,以便更好地学习字符串。我一直在纠结的规则是:

  • 如果一个单词以元音开头,只需在单词的末尾加一条路。
  • 如果一个单词以辅音开头,则将第一个元音之前的辅音移到单词的末尾,并添加ay。

我可以让元音工作,但如果我命中一个常量,我就会陷入无限循环。我对编程和C#相当陌生。任何帮助,这将是非常感谢的,并希望能帮助我理解的区域。

我试着用文本创建一个字符,使用文本创建一个int来检查每个字母。不知道该怎么做。

这是翻译按钮代码:

代码语言:javascript
运行
复制
private void transBtn_Click(object sender, EventArgs e)
{
    english = engTxtBx.Text;
    english = english.Trim();
    string[] columns = english.Split(' ');
    for (int i = 0; i < columns.Length; i++)
    {
        string text = columns[i];
        char first = text[0];
        for (int c = 0; c < text.Length; c++)
        {
            char character = text[c];
            //int consonant = text.IndexOf(character);
            if (isVowel(first))
            {
                text = text + "way ";
                pigLatin = text;
                plTxtBx.Text += text;
            }
            else if (!isVowel(character))
            {
                if (isVowel(text[c + 1]))
                {
                    text.Remove(text.IndexOf(character), 1);
                    text += character + "ay";
                    pigLatin = text;
                    plTxtBx.Text += text;
                }
                break;
            }
        }
    }

public static bool isVowel(char c)
{
    return new[] {'a','e','i','o','u'}.Contains(char.ToLower(c));
}

如果我键入短语“我可以有一个苹果”,看应该从第一个字符移到末尾,并在后面添加"ay“。现在,当我调试时,c不被删除,而是添加到末尾,ay被添加。然后它就卡在“我”上了。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-27 23:09:46

所以Robert提供了一个修复程序,但是既然您说您是编程新手,我将尝试解释这个问题,我将尝试用一个简单的示例来解释您正在做的事情:

代码语言:javascript
运行
复制
string text = "Hello!";
for(int i = 0; i < text.Length; i++)
{
     text += "!";
}

您的循环条件基于text.Length,但是在循环中,您要附加到该文本中,所以每次循环准备好重新启动时,它都会检查text.Length并说,“嗯,我--仍然--不是在text.Length的末尾,所以我想我会继续循环。

如果只想根据字符的初始值循环,则应该:

A.将text.Length存储在循环之前的一个单独的变量中,然后将循环条件以它为基础,如下所示:

代码语言:javascript
运行
复制
string text = "Hello!";
int initialLength = text.Length;
for(int i = 0; i < initialLength; i++)
{
     text += "!";
}

B.或者更好的是,不要在文本变量中添加更多的内容,而是使用单独的字符串变量作为“修改”副本:

代码语言:javascript
运行
复制
string text = "Hello!";
string text2 = text;
for(int i = 0; i < text.Length; i++)
{
     text2 += "!";
}

C.或者最好的方法是采用B方法,但使用StringBuilder类。在C#中,当您修改字符串时,系统将在内存中创建一个全新的字符串副本以及额外的字符,因此如下所示:

代码语言:javascript
运行
复制
text = "Hello";
text += "!";
text += "!";
text += "!";

...is实际上在内存中创建了四个不同的字符串变量:

你好,你好!你好!!你好!

这只是暂时的事情,但效率低下,浪费。StringBuilder类的目的是让您高效地构建一个字符串,一个接一个地构建:

代码语言:javascript
运行
复制
StringBuilder sb = new StringBuilder("Hello");
sb.Append("!");
sb.Append("!");
sb.Append("!");
Console.WriteLine(sb.ToString()); // "Hello!!!"

因此,如果查看示例B,可能会将其更改为:

代码语言:javascript
运行
复制
string text = "Hello!";
StringBuilder sbText = new StringBuilder(text);
for(int i = 0; i < text.Length; i++)
{
     sbText.Append("!");
}

我的最后一个建议也是以您希望的方式获得字符串/内容,然后将其分配给您的控件。所以不要这么叫10次:

代码语言:javascript
运行
复制
 plTxtBx.Text += text;

相反,让你的文本设置正确的方式,然后在最后,只做一个简单的任务:

代码语言:javascript
运行
复制
 plTxtBx.Text = final_text;

其原因是控件具有各种事件,以及在修改文本等属性时运行的小齿轮和齿轮。如果您执行+=技巧将文本附加到Textbox控件,那么每次更新文本时,都会强制该控件运行其整个例程。

这些都是小的低效率,但随着时间的推移,它们加在一起,因此,这是一个很好的做法,在前面做。

因此,如果我采用了Robert的建议代码(我没有亲自测试过它)并对它做了一些修改,我会这样做的:

代码语言:javascript
运行
复制
private void transBtn_Click(object sender, EventArgs e)
{
    // Start with whatever is in plTxtBx
    StringBuilder sb = new StringBuilder(plTxtBx.Text); 

    // Break into words
    string[] columns = engTxtBx.Text.Trim().Split(' ');
    for (int i = 0; i < columns.Length; i++)
    {
        if (isVowel(columns[i][0]))
        {
            // Start with vowel.
            sb.Append(columns[i]);
            sb.Append("way");
        }
        else
        {
            // Start with consonant. Get index of first vowel.
            int index = columns[i].IndexOfAny(vowels);
            if (index == -1)
            {
                // No vowel in columns[i].
                // You have to decide what to do.
            }
            else if (index == 1)
            {
                // First vowel is the second letter.
                sb.Append(columns[i].Substring(1));
                sb.Append(columns[i][0]);
                sb.Append("way");
            }
            else
            {
                // First vowel is after the second letter.
                sb.Append(columns[i].Substring(index));
                sb.Append(columns[i].Substring(index - 1, 1));
                sb.Append("way");
            }

        }
    }

    // Update plTxtBx's Text once with the final results
    plTxtBx.Text = sb.ToString();

}
票数 0
EN

Stack Overflow用户

发布于 2019-07-27 22:26:12

我已经做了几次改变来使它起作用。请看我在代码中的评论。

代码语言:javascript
运行
复制
private void transBtn_Click(object sender, EventArgs e)

{
    english = engTxtBx.Text;
    english = english.Trim();
    string[] columns = english.Split(' ');
    for (int i = 0; i < columns.Length; i++)
    {
        if (isVowel(columns[i][0]))
        {
            // Start with vowel.
            pigLatin = columns[i] + "way";
        }
        else
        {
            // Start with consonant. Get index of first vowel.
            int index = columns[i].IndexOfAny(vowels);
            if (index == -1)
            {
                // No vowel in columns[i].
                // You have to decide what to do.
            }
            else if (index == 1)
            {
                // First vowel is the second letter.
                pigLatin = columns[i].Substring(1) + columns[i][0] + "way";
            }
            else
            {
                // First vowel is after the second letter.
                pigLatin = columns[i].Substring(index) + columns[i].Substring(index - 1, 1) + "way";
            }

        }
        plTxtBx.Text += pigLatin;
    }

}

private static char[] vowels = { 'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U' };

private static bool isVowel(char c)
{
    return vowels.Contains(c);
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57236219

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档