int variable = sentence.Length赢了工作但是句子.Length会

时间:2016-11-23 01:26:12

标签: c# string

代码的目标是删除有2个空格的位置,并用一个空格替换它们。

static void Main(string[] args)
    {
        string sentence = Console.ReadLine();
        int size = Convert.ToInt16(sentence.Length);

        for (int i = 0; i < size - 1; i++)
        {
            sentence = sentence.Trim();
            while ((sentence[i] == ' ' ) && (sentence[i+1] == ' '))
            {
                sentence = sentence.Remove(i + 1, 1);
            }
        }

        Console.WriteLine(sentence);
        Console.ReadLine();
    }

由于某种原因,如果您抛出2个或更多空格,此代码将无法正常工作。 但是如果你使用sentence.Length而不是上面的大小变量,那么这个可行。

static void Main(string[] args)
    {
        string sentence = Convert.ToString(Console.ReadLine());
        for (int i = 0; i < sentence.Length - 1; i++)
        {
            while ((sentence[i] == ' ') && (sentence[i + 1] == ' '))
            {
                sentence = sentence.Remove(i + 1, 1);
            }
        }
        Console.WriteLine("Sentence:{0}", sentence);
        Console.ReadLine();
    }

为什么赢得第一个代码片段?

3 个答案:

答案 0 :(得分:0)

它破坏的原因是您的第一个代码块中的这一行:sentence = sentence.Trim();

在添加空格的情况下,您正在更改字符串的长度,但循环仍将具有先前设置的大小变量。所以说你键入:'test '然后大小为6,但修剪将使实际大小为4,即:test。因此,当您尝试访问时,抛出一个超出范围的异常:sentence[5]

希望这是有道理的。

编辑:int size = Convert.ToInt16(sentence.Length);当您设置大小时,您将获得句子字符串的实际大小。

这会导致(sentence[i] == ' ' ) && (sentence[i+1] == ' ')由于i + 1而违反我们的界限,因为这会导致它转到size + 1 在第二个代码块中,您执行此操作:sentence.Length - 1因此i + 1最大值= sentence.Length

答案 1 :(得分:0)

如果从字符串中删除字符,sentence.Length - 1会相应地增加或减少字符串的大小。虽然size - 1在循环之前被修复,但它会给你Index was outside the bounds of the array.所以在第一种情况下你会得到错误。但在第二种情况下,您的程序成功运行。

Dry run是一种技术,您可以看到当程序收到一些输入时会发生什么,然后像调试器一样跨越循环中的每一步。

答案 2 :(得分:0)

考虑第一个代码段:

首先要注意的是Fragment f = new fragB(TYPE_FOOD); 将为您提供一个整数值,因此不需要使用sentence.Length将其再次转换为整数,您可以使用Convert.ToInt16()。< / p>

让输入为int size = sentence.Length,字符串的长度为"this is sample",并带有两个额外的空格。通过删除第一个额外空格,inputString的长度变为16,这意味着循环的最后一次迭代将抛出异常,当您删除第二个空格时,您将在最后的第二次迭代中获得15。所以这不是一个很好的方法来做到这一点;

最好保留需要删除的字符的索引,并编写第二个循环以从输入字符串中删除它们;