2013-12-02 3 views
0
#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

Пожалуйста, покажите нам, что вы уже пробовали, и т.д. SO не генератор кода ... –

ответ

0

псевдокод в while()

if issapce() s++ print count count=0; 
else count++ s++; 

нет никакой разницы с цифрами и буквами.

+0

Это было бы более удобным для чтения, если вы отметили код * как * код. – crashmstr

0

Рассмотрим эту строку ...

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

перед началом, s указывает на первый символ нового слова. После этого он указывает на первый символ после этого нового слова. Если мы возьмем эти два указателя ...

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

У вас есть указатели на исходную строку, которая идентифицирует слово. Чтобы получить длину слова, вы можете вычесть указатель начала с конечного указателя. Чтобы вывести слово (используя аналогичный код стиля C), вы можете пропустить этот символ диапазона по символу.

Чтобы избежать этого цикла, вы можете временно изменить символ с заостренным концом на нуль, а затем вернуться после печати. [извините - думая о старых днях, прежде чем мы использовали const].

Вы также можете использовать один из конструкторов std::string, чтобы скопировать и сохранить это слово, а затем вы можете использовать метод length, чтобы прочитать его длину.

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); 
} 
-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); 
} 
+0

Зачем использовать 'malloc' в C++? – crashmstr

+0

Почему count должен быть без знака int, а не size_t? –

+0

@crashmstr для выделения памяти в массиве char – HAL9000

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

Что случилось с while (! Iss.eof())? – Luke

+0

Проверьте результат извлечения - if (iss >> word) - не состояние до –

+0

@ Luke См. [Этот ответ] (http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a -loop-condition-thought-wrong) –

Смежные вопросы