【问题标题】:Count number of words in a sentence excluding punctuation and more than one space between words计算句子中的单词数,不包括标点符号和单词之间的多个空格
【发布时间】:2016-05-25 03:07:15
【问题描述】:

我正在尝试创建一个程序来计算句子中的单词数,但是当我找到空格或标点符号(?、!、:、;或。)时,我不能假设下一个字符将是一封信。如果我正在寻找一个字母,我需要跳过所有空格和标点符号,直到我找到既不是空格也不是标点符号的东西。我还需要考虑到单词之间可能有多个空格。我写了一个标点函数:

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;
}

我用它来查找用户输入的句子数量。不过,我现在需要查找字数,并且很难找到不使用空间位置的方法。我已经用这个功能走了这么远,但需要一些帮助!非常感谢任何建议:)

void num_sentence (string phrase)

{

    int num_sentence = 0;
    for (int i = 0; i < phrase.length(); i++)
    {
        if (is_punctuation(phrase.substr(i,1))== true)
            num_sentence++;
    }

【问题讨论】:

  • 你看到多少个句子???

标签: c++ string boolean word-count


【解决方案1】:

首先,将std::string 用于单个字符是没有意义的。这就是char 的用途。

现在,反过来做会容易得多:检查字符是否是字母,而不是标点符号。这很简单:字符是在 a-z 还是 A-Z 范围内。对于这种情况,包含撇号也是一个好主意,例如,“it's”看起来就像一个单词:

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;
}

现在,这不是和我之前的描述完全一样,翻译成代码吗?

【讨论】:

    猜你喜欢
    • 2013-10-24
    • 2020-01-14
    • 1970-01-01
    • 2018-03-04
    • 1970-01-01
    • 2016-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多