【问题标题】:How to split a string if the delimiter is one or more spaces?如果分隔符是一个或多个空格,如何拆分字符串?
【发布时间】:2018-10-04 19:01:52
【问题描述】:

我试图让它将输入中的每个单词都写在一个新行中,即使单词之间有更多空格,但我无法弄清楚这有什么问题。

string phrase = Console.ReadLine();
string currentWord = ""; 

for (int i = 0; i < phrase.Length; i++)
{
if (phrase[i] == ' ') 
    Console.WriteLine(currentWord);
currentWord = "";
while (phrase[i] == ' ') 
    i++; 
if (phrase[i] != ' ') 
    currentWord += phrase[i];
}
Console.WriteLine(currentWord);

我只收到每个单词的最后一个字母。请帮忙?

如果假设我想打印出短语的第 n 个单词(n 来自输入),我该怎么做?

【问题讨论】:

    标签: c# string loops if-statement


    【解决方案1】:

    由于您没有在 if 语句中使用大括号,因此此代码将在每次迭代中执行:

    currentWord = "";
    

    所以你重置了currentWord 的值。

    您可以简单地使用Split 方法和StringSplitOptions.RemoveEmptyEntries,无需重新发明轮子:

    var words = phrase.Split(new [] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
    

    【讨论】:

    • 如果 while 循环是正确的,那将不是什么大问题。真正的错误是内部循环中缺少大括号。
    • @Eva 避免此类问题的方法是总是放在括号中
    • 不使用大括号的唯一“好”理由是,如果您有一个 难以置信 简单而简短的 if 语句(但仍然要使用它们)。空白也是你的朋友。如果您在代码中的此处或此处有一个空行,这将更加明显。你现在拥有的东西混合在一起,变得有点难以阅读。更好的缩进做法也会有所帮助。
    【解决方案2】:

    当您不在 ifwhile 正文中使用花括号时会发生这种情况...

    用大括号写出它们并找出与当前代码的不同之处。

    【讨论】:

    • 空白和适当的缩进也不会受到伤害。由于所有内容都挤在一起并且几乎都处于相同的缩进水平,因此更难破译。
    【解决方案3】:

    我可能会这样做..

    首先添加这个引用:

    using System.Text.RegularExpressions;
    

    然后您可以使用一个简单的正则表达式将您的字符串拆分为单词并使用 foreach 循环来显示单词:

    var phrase = Console.ReadLine();
    var words = Regex.Split(phrase, @"\s+");
    
    foreach(var word in words)
        Console.WriteLine(word)
    

    与您拥有的代码相比,这也更加简洁,这使得它更易于阅读、理解和维护。

    【讨论】:

      【解决方案4】:

      你可以用Replace方法替换char

      关注代码:

      Console.ReadLine().Replace(" ","");
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-30
        • 1970-01-01
        • 1970-01-01
        • 2010-11-30
        • 1970-01-01
        • 1970-01-01
        • 2021-09-21
        • 2018-08-08
        相关资源
        最近更新 更多