控制台应用程序,用于计算句子中的单词数。 (C#)

时间:2018-10-06 10:36:58

标签: c# string algorithm

该程序检查句子中的每个字符。每当字符是一个空格(“”)时,numberOfWords(变量)将增加1。 这是正确的方法吗?

        string sentence;
        int numberOfWords;
        int sentenceLength;
        int counter;
        string letter;


        Console.Write("Sentence :");
        sentence = Console.ReadLine();
        sentenceLength = sentence.Length;
        numberOfWords = 1;
        counter = 0;

        while (counter < sentenceLength)
        {
            letter = Convert.ToString(sentence[counter]);
            if (letter == " ")
            {
                numberOfWords++;
                counter++;
            }
            else
            {
                counter++;
            }

        }

        Console.Write("Number of words in this sentence :");
        Console.WriteLine(numberOfWords);
        Console.ReadLine();

2 个答案:

答案 0 :(得分:0)

只需坚持实现的样式,假设输入仅用单个空格分隔,那么将句子字符串分隔在每个空白字符上就更好了。

string[] words = sentence.Trim().Split(null);

使用null作为参数,空格将用于拆分。 Trim()删除尾随和前导空格字符。 然后,使用words.Length可以轻松地获得用空格隔开的单词数。但是,这不会考虑双空格或空句子。最好使用regex删除双倍或更多的空格。

RegexOptions options = RegexOptions.None;
Regex regex = new Regex("[ ]{2,}", options);     
sentence = regex.Replace(sentence, " ");

答案 1 :(得分:0)

好吧,简单的答案是;不要重新发明轮子,请使用现有工具:

var numberOfWords = 
   sentence.Split(
       ' ',                            
       StringSplitOptions.
           RemoveEmptyEntries).Length;

但是那会欺骗...

因此,以您的代码为基础,需要修复一些问题:

首先,不要让您的方法做太多事情。没有理由为什么单词计数方法应该不知道如何将结果输出到任何给定的用户界面。只需创建一个知道如何计算单词并返回单词数的方法即可:

public static int CountWords(string sentence) { ...}

现在,您可以在任何类型的应用程序中重用此方法;控制台,Windows窗体,WPF等。

第二,快速排除极端情况或琐碎情况。空句子是一个错误或没有单词。选择您要如何处理此方案。如果说0个字有意义,那么您可以一击解决一些情况:

    if (string.IsNullOrWhiteSpace(sentence))
        return 0;

第三,不要执行不必要的转换;仅将字符转换为字符串以与" "执行相等检查是浪费的。直接比较字符(' ',或使用恰当命名的char.IsWhiteSpace(+)方法。

第四,您的逻辑有缺陷。双倍空格,前导空格等都会给您错误的结果。原因是您在计算单词时的条件是错误的。遇到空白并不一定意味着一个新词即将到来。另一个空格可能正在等待,您在上一次迭代中已经遇到了空格,句子可能会结束,等等。

为了使您的逻辑起作用,您需要跟踪以前发生的事情,现在正在发生的事情以及接下来将要发生的事情...如果这听起来很混乱且过于复杂,请不要担心,您绝对正确。< / p>

一种更简单的方法是将逻辑改变一点;假设我们每次发现非空白(*)开头都有空白,就会遇到一个新词。之后发生的事无关紧要,因此我们使事情变得简单得多:

var counter = 0;
var words = 0;,
var previousIsWhiteSpace = false;

while (counter < sentence.Length)
{
    if (char.IsWhiteSpace(sentence[counter]))
    {
        previousIsWhiteSpace = true;
    }
    else if (previousIsWhiteSpace) 
    {
         words += 1;
         previousIsWhiteSpace = false;
    }

    counter += 1;
}

将所有内容放在一起就可以了。

(+),这实际上会将更多的常规空格标记为有效的空白;标签,新行等都将返回true。

(*)我忽略了涉及标点符号,分隔符等的情况。