【问题标题】:Logical error in simple acronym generator简单首字母缩写词生成器中的逻辑错误
【发布时间】:2013-09-19 14:49:04
【问题描述】:

我的程序中有某种逻辑错误。每当我输入一个带有 1 个字母的短语时,我都会收到 ArgumentOutOfRange 异常,并且每当我输入一个多字母单词时,文本框就会清除,显示“Apple”(我的数组中的第一个值)并且什么都不做。有人能看出其中的逻辑错误吗?

string[] d = { "Apple", "Bass", "Cat", "Dog", "Ear", "Flamingo", "Gear", "Hat", "Infidel", "Jackrabbit", "Kangaroo", "Lathargic", "Monkey", "Nude", "Ozzymandis", "Python", "Queen", "Rat", "Sarcastic", "Tungston", "Urine", "Virginia", "Wool", "Xylophone", "Yo-yo", "Zebra", " " };
string var;
int len = 0;

private void button1_Click(object sender, EventArgs e)
{
    var = textBox2.Text;
    textBox1.Text = "";
    for (int y = 0; y < var.Length; y++)
    {
        for (int x = 0; x < d.Length; x++)
        {
            if (d[x].ToUpper().Substring(0, 0) == var.ToUpper().Substring(len, len))
            {
                len = len + 1;
                textBox1.Text = textBox1.Text + "\n" + d[x];
            }
        }
    }
}

【问题讨论】:

  • 我已经删除了不相关的代码。您应该始终只发布与问题相关的部分。
  • 通过调试代码,您会发现自己有很多异味。在 button1_Click 中放置一个断点,你会发现它。

标签: c#


【解决方案1】:

Substring(0, 0) 真的毫无意义。这将始终是一个空字符串。

Substring(len, len) 也是一个坏主意,因为它会返回一个长度为 len 的字符串,从索引 len 开始。这是您获得异常的地方。

我假设,您真正想要的是第二个参数在两种情况下都为 1。这可以进一步简化为通过索引访问:

d[x].ToUpper()[0] == var.ToUpper()[len]

【讨论】:

    【解决方案2】:

    您可以使用 LINQ 轻松完成同样的工作:

    private void button1_Click(object sender, EventArgs e)
    {
        var dict = d.ToDictionary(x => x.First(), x => x);
        textBox1.Text = string.Join(Environment.NewLine, textBox2.Text.Select(x => dict[char.ToUpper(x)]));
    }
    

    要在没有 LINQ 的情况下执行此操作,我建议如下:

    for (int y = 0; y < input.Length; y++)
    {
        for (int x = 0; x < d.Length; x++)
        {
            if (char.ToUpper(d[x][0]) == char.ToUpper(input[y]))
            {
                result = result + "\n" + d[x];
            }
        }
    }
    

    变化是:

    • 您不需要len 变量。请改用y
    • 您不需要将整个string 大写。请改用char.ToUpper 静态方法。
    • 您不需要string.Substring 方法。请改用索引器。

    【讨论】:

    • 啊,谢谢。我在 C# 方面相当缺乏经验,并且正在使用我从其他语言中获得的知识来实现​​这一点。我不知道你可以这样索引字符串。感谢您的帮助。
    【解决方案3】:

    这一行解释了这种行为。

    if (d[x].ToUpper().Substring(0, 0) == var.ToUpper().Substring(len, len))
    

    子字符串的第二个参数是字符串长度。所以在左边你总是有一个空字符串。在右侧,当 len==0 时,您也有空字符串(这就是您的代码总是选择 Apple 的原因)。

    之后更改 len,然后重复循环。然后右边的表达式是 var.Substring(1,1) 如果你的字符串是 1 个字符长,它会给你错误。因为这读取 - 1 以 1 开头的符号(这是字符串的第二个字符)

    除此之外,代码的用途完全是个谜,所以肯定还有其他错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多