代码的目标是删除有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();
}
为什么赢得第一个代码片段?
答案 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
。所以这不是一个很好的方法来做到这一点;
最好保留需要删除的字符的索引,并编写第二个循环以从输入字符串中删除它们;