计算和打印句子中每个单词的长度

时间:2013-12-02 19:19:03

标签: c++ string

#include <iostream>
#include <string>
#include <cctype>
size_t countwords(const char *);
using namespace std;

int main()
{
    char a[] =  "Four score and seven years ago";
    cout << countwords(a);

    return 0;
}

size_t countwords( const char *s )
{
    size_t count = 0;

    while ( *s )
    {
        while ( isspace( *s )) ++s;
        if ( *s ) ++count;
        while ( isalnum( *s )) ++s;
    }



    return ( count );
}

我唯一缺少并且不知道如何执行的是打印句子中每个单词的长度。除了返回单词计数之外,我需要我的功能来打印单词并且它的长度并排。并且还要打印平均字符数。所以,例如,如果句子是“四分”,我需要:

Four 4
scores 5

average: 4.5

6 个答案:

答案 0 :(得分:1)

如果您有C ++ 11,则可以使用<regex>执行此操作。请注意,有些编译器对此并不十分合规,但VC ++ 12(VS2013)似乎做得很好,GCC is coming along。这是整个计划:

#include <iostream>
#include <string>
#include <functional>
#include <regex>
int main() {
    std::string input("Four score and seven years ago");
    std::regex exp(R"([\w]+)");
    int matches = 0, lengthSum = 0;
    std::for_each(
        std::sregex_token_iterator(input.begin(), input.end(), exp),
        std::sregex_token_iterator(),
        [&](std::ssub_match sm) {
            std::cout << sm << ": " << sm.str().size() << std::endl;
            matches++;
            lengthSum += sm.str().size();
        });
    std::cout << "Average: " << static_cast<float>(lengthSum) / matches << std::endl;
}

答案 1 :(得分:0)

while()

中的伪代码
if issapce() s++ print count count=0;
else count++ s++;

数字和字母没有区别。

答案 2 :(得分:0)

考虑这一行...

while ( isalnum( *s )) ++s;

在开始之前,s指向新单词的第一个字符。之后,它指向该新单词之后的第一个字符。如果我们抓住那两个指针......

const char *wordbegin = s;
while ( isalnum( *s )) ++s;
const char *wordend   = s;

您有指向标识该单词的原始字符串的指针。要获得单词的长度,可以从结束指针中减去开始指针。要输出单词(使用类似的C风格代码),您可以逐个字符循环遍历该范围。

为了避免这种循环,您可以暂时将指向结束的字符更改为空,然后在打印后再将其返回。 [抱歉 - 在我们使用{{1}之前的过去}]。

你也可以使用const的一个构造函数来复制并存储该单词,然后你可以使用std::string方法来读取它的长度。

答案 3 :(得分:0)

没有测试:

size_t countwords( const char *s )
{
    size_t count = 0;
    size_t total_length = 0;

    while ( *s )
    {
        while ( isspace( *s )) ++s;
        if ( *s )
        {
            ++count;

            size_t word_length = 0;
            while ( isalnum( *s ))
            {
                std::cout << *s;
                word_length++;
                ++s;
            }
            std::cout << '\t' << word_length << std::endl;
            total_length += word_length;
        }
    }

    std::cout << "average: " << ( count == 0 ? 0.0 : static_cast<double>( total_length ) / count )
              << std::endl; 

    return ( count );
}

答案 4 :(得分:0)

#include <iostream>
#include <vector>
#include <sstream>


int main() {
    std::string line =  "Four score and seven years ago";
    std::vector<std::string> words;
    std::istringstream iss(line);
    std::string word;
    while( iss>>word ){
        words.push_back(word);
    }
    double sum = 0;
    for(int i=0; i<  words.size(); ++i){
        std::cout<<words[i]<<" "<<words[i].size()<<std::endl;
        sum += words[i].size();
    }

    std::cout<< "average:"<< sum/words.size()<<std::endl;
    return 0;
}

答案 5 :(得分:-1)

注意:计数应为unsigned int,而不是size_t

您可以像这样编辑代码:

size_t countwords( const char *s )
{
    char *tmpWord = (char*) malloc(sieof(char)*strlen(s));
    int tmpLength = 0;
    while ( *s )
        {
            tmpLength = 0;
            while ( isspace( *s )) ++s;

            do{
                tmpWord[tmpLength++] = *s;
                ++s;
            }while(!isspace(*s));

            if ( *s ){ 
                ++count;
                printf("\n%s %d",tmpWord,--tmpLength);
            }
            while ( isalnum( *s )) ++s;
        }
free(tmpWord);
}