#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
答案 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);
}