C# int变量=句子。长度为';只有句子才行,长度才行

C# int变量=句子。长度为';只有句子才行,长度才行,c#,string,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 = se

该代码的目标是删除有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();
    }
static void Main(字符串[]args)
{
string语句=Console.ReadLine();
int size=Convert.ToInt16(句子长度);
对于(int i=0;i
由于某些原因,如果抛出2个或更多空格,此代码将无法工作。 但如果你使用句子长度,而不是上面的大小变量,这个就行了

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();
    }
static void Main(字符串[]args)
{
string语句=Convert.ToString(Console.ReadLine());
for(int i=0;i<句子长度-1;i++)
{
while((句子[i]='')和&(句子[i+1]='')
{
句子=句子。删除(i+1,1);
}
}
Console.WriteLine(“句子:{0}”,句子);
Console.ReadLine();
}

为什么第一个代码段不起作用?

它中断的原因是第一个代码块中的这一行:
句子=句子.Trim()

在添加空格的情况下,您正在更改字符串的长度,但循环仍将在前面设置大小变量。假设您键入:
“test”
则大小为
6
,但修剪将使实际大小
4
,即:
test
。因此,当您尝试访问时抛出一个越界异常:
语句[5]

希望这是有道理的

编辑:
int size=Convert.ToInt16(句子长度)设置大小时,您得到的是句子字符串的实际大小

由于
i+1
,它将导致
(句子[i]='')和&(句子[i+1]='')
超出我们的界限,因为这将导致它进入
大小+1

在第二个代码块中,您可以这样做:
句子.Length-1
因此
i+1
最大值=
句子.Length

,因为如果从字符串中删除字符,
句子.Length-1
将相应地增大或减小字符串的大小。而
size-1
在循环之前是固定的,它会给你
索引超出数组的界限。
所以在第一种情况下你会得到错误。但在第二种情况下,程序运行成功


干运行是一种技术,在这种技术中,您可以看到当程序接收到一些输入,然后像调试器一样跳过循环中的每一步时会发生什么

考虑第一个片段:

首先要注意的是
句子。Length
将为您提供一个整数值,因此无需使用
convert.ToInt16()
将其再次转换为整数。您可以使用
int size=句子。Length

让输入为
“这是示例”
,字符串长度为
16
,并附加两个空格。通过删除第一个额外的空格,inputString的长度变为
15
,这意味着循环的最后一次迭代将抛出异常,当删除第二个空格时,将在最后第二次迭代中获得
IndexOutOfRangeException
。所以这不是一个很好的方法


因此,最好保留需要删除的字符的索引,并编写第二个循环将其从输入字符串中删除

使用调试器并逐步完成代码。无需调用
Convert
,顺便说一句,谢谢您的回答!但即使在删除句子后。Trim(),代码仍然不起作用=(ConsoleApplication6.exe中发生类型为“System.IndexOutOfRangeException”的未处理异常。由于
句子=句子。删除(i+1,1),因此更新了我的应答
也会更改字符串的长度。请在调试器中逐步检查代码。谢谢你们,我不会再犯同样的错误,并确保我的同学也理解。再次感谢!=)非常感谢您的解释!!=)@清晰:我很高兴你喜欢它,并且理解了它。我一定会尝试这种方法,真不敢相信我不记得了。非常感谢你!他的转变也有一个缺陷。他将32位整数转换为16位整数,然后再转换回32位整数,这意味着可能会丢失一半的位。