我试图创建一个程序来计算句子中的单词数量但是当我找到空格或标点符号时(?,!,:,;或者。)我不能认为下一个字符将是一封信。如果我正在寻找一封信,我需要跳过所有空格和标点,直到找到既不是空格也不是标点符号的东西。我还需要考虑到单词之间可能有多个空格。我写了一个标点函数:
Number
我用它来查找用户输入的句子数。我现在需要找到单词计数,并且在没有使用空间位置的情况下很难找到这样做的方法。我已经完成了这个功能但需要一些帮助!非常感谢任何建议:)
bool is_punctuation (string character)
{
if (character == "!")
return true;
else if (character == "?")
return true;
else if (character == ";")
return true;
else if (character == ":")
return true;
else if (character == ".")
return true;
else
return false;
}
答案 0 :(得分:0)
首先,对单个字符使用std::string
是没有意义的。这是char
的用途。
现在,反过来要做得更容易:检查字符是否是字母,而不是标点符号。这很简单:角色是否在a-z或A-Z范围内。对于这种情况,包含撇号也是一个好主意,所以"它的#34;例如,看起来像一个单词:
bool is_letter(char c)
{
return ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '\'')
? true:false;
}
您遇到的另一个问题是如何定义单词。看看任何一句话。你在哪里看到每个单词开始?当你看到一封信。每个单词什么时候结束?当你看到除了一封信以外的其他东西时。
您不计算标点符号的数量。如果单词之间有一个,两个,三个或更多非字母字符,你就不在乎。
当您扫描一个句子时,从开始到结束,您一次扫描一个字符。一旦你看到一封信,那就是下一个单词的开头。当你不再看到一封信时,这就是这个词的结尾,那么你只需继续寻找,直到你看到下一个字母。这将成为下一个词。
换句话说,如果您看到的前一个字符不是字母,但当前字符是一个字母,您只看到另一个字的开头。
现在,您所要做的就是将其转换为代码:
size_t num_words(const std::string &sentence)
{
bool previous_char_was_letter=false;
size_t n=0;
for (char c:sentence)
{
bool this_char_is_letter=is_letter(c);
if (!previous_char_was_letter && this_char_is_letter)
++n;
previous_char_was_letter=this_char_is_letter;
}
return n;
}
现在,这个读取的内容与我之前的描述完全不同,翻译成代码吗?