如何统计有多少单词排成一行?更聪明的方式?

时间:2017-03-21 15:00:42

标签: c++

如何找出排队的字数?我现在用你计算有多少空格的方法。但是,如果有人击中2个空格或开始与空间对齐,那该怎么办呢。

还有其他或更聪明的方法来解决这个问题吗?

我的解决方法或代码方式有什么评论吗?

我解决了这个问题:

#include <iostream>
#include <cctype>
#include <cstring>

using namespace std;

int main( )
{
    char str[80];

    cout << "Enter a string: ";
    cin.getline(str,80);

    int len;

    len=strlen(str);

    int words = 0;

    for(int i = 0; str[i] != '\0'; i++) //is space after character
    {
        if (isalpha(str[i])) 
        {
            if(isspace(str[i+1]))
            words++;
        }       
    }

    if(isalpha(str[len]))
    {
        words++;
    }

    cout << "The number of words = " << words+1 << endl;

    return 0;
}

3 个答案:

答案 0 :(得分:2)

std one-liner是:

words= distance(istream_iterator<string>(istringstream(str)), istream_iterator<string>());

答案 1 :(得分:0)

默认情况下,

流跳过空格(也是多个)。

所以,如果你做了类似的事情:

string word;
int numWords = 0;
while (cin >> word) ++numWords;

这应该计算简单案例的单词数量(不考虑单词的格式是什么,跳过空格)。

如果你想要每行,你可以首先读取该行,从字符串创建一个流,并做类似的事情:

string line, word;
int wordCount = 0;
getline(cin, line);
stringstream lineStream(line);
while (lineStream >> word) ++wordCount;

你不应该使用cin.getline并且应该更喜欢自由函数std::getline,它接受​​一个可以长大的字符串并防止堆栈溢出(lol)。坚持自由功能,以提高安全性。

答案 2 :(得分:0)

首先,您需要一个非常具体的“单词”定义。大多数答案的计数与您的尝试略有不同,因为您使用的是对单词构成的不同定义。您的示例特别需要在某些位置使用字母字符。基于流的答案将允许任何非空格字符成为单词的一部分。

一般的解决方案是提出一个单词的精确定义,将其转换为正则表达式或有限状态机,然后计算匹配的每个实例。

这是一个示例状态机解决方案:

std::size_t CountWords(const std::string &line) {
    std::size_t count = 0;
    enum { between_words, in_word } state = between_words;
    for (const auto c : line) {
        switch (state) {
            case between_words:
                if (std::isalpha(c)) {
                    state = in_word;
                    ++count;
                }
                break;
            case in_word:
                if (std::isspace(c)) state = between_words;
                break;
        }
    }
    return count;
}

要考虑的一些测试用例(并突出显示单词定义之间的差异):

  • ""空字符串
  • " "只是空格
  • "a"
  • " one "
  • "count two"
  • "hyphenated-word"
  • "\"That's Crazy!\" she said."字母与相邻空格之间的标点符号
  • "the answer is 42"数字应算作单词吗?