此程序检查句子中的每个字符。每次字符是空格(“”)时,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();
最佳答案
嗯,简单的答案是;不要重新发明轮子,使用现有工具:
var numberOfWords =
sentence.Split(
' ',
StringSplitOptions.
RemoveEmptyEntries).Length;
但那会是作弊......
因此,根据您的代码,需要修复一些问题:
首先,不要让您的方法做太多事情。一个计算单词的方法没有理由知道如何将结果输出到任何给定的用户界面。只需制作一个知道如何计算单词并返回单词数的方法:
public static int CountWords(string sentence) { ...}
现在您可以在任何类型的应用程序中重用此方法;控制台、Windows 窗体、WPF 等。
其次,快速排除角落或琐碎的情况。空句要么是错误的,要么没有单词。选择您希望如何处理此场景。如果0个词有意义,你可以一次解决几个案例:
if (string.IsNullOrWhiteSpace(sentence))
return 0;
第三,不要进行不必要的转换;将字符转换为字符串只是为了使用 ""
执行相等性检查是一种浪费。直接比较字符 (' '
),或使用恰当命名的 char.IsWhiteSpace
(+) 方法。
第四,你的逻辑有问题。双空格、前导空格等都会给您错误的结果。原因是您关于何时计算单词的条件是错误的。遇到空格并不一定意味着新词即将出现。另一个空格可能正在等待,你在之前的迭代中已经遇到了一个空格,句子可能结束,等等。
为了使您的逻辑正常工作,您需要跟踪之前发生的事情、现在发生的事情以及接下来会发生的事情……如果这听起来很困惑并且过于复杂,请不要担心,您是绝对正确的。
一个更简单的方法是稍微改变你的逻辑;假设我们每次发现前面有一个空格的非空格 (*) 时都会遇到一个新单词。之后发生的事情无关紧要,所以我们只是让事情变得容易得多:
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;
}
把它们放在一起就完成了。
(+) 这实际上会将不止一个常规空格标记为有效空格; tab、换行等都会返回true。
(*) 我忽略了涉及标点符号、分隔符等的场景。
关于c# - 计算句子中单词数的控制台应用程序。 (C#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52678177/