C ++一次打印一个字,计算字符和字符的平均值

时间:2015-04-25 21:49:30

标签: c++ string

如何从每行中的字符串中打印单个单词,旁边的字符数和字符的平均值?我想使用字符串成员函数将对象转换为c字符串。函数 countWords 接受c字符串并返回int。该函数假设读取每个单词及其长度,包括字符的平均值。我已经完成了字符串中有多少单词,除非我不知道如何继续其余的单词。

例如:超级大炮男孩

super 5

很棒5

加农炮6

男孩4

字符平均值:5

到目前为止,这是我的计划:

#include <iostream>
#include <string>
#include <cstring>

using namespace std;

int countWords(char *sentence);

int main()
{
    const int size=80;
    char word[size];
    double average=0;
    cout<<"Enter words less than " <<size-1<<" characters."<<endl;
    cin.getline(word, size);
    cout <<"There are "<<countWords(word)<<" words in the sentence."<<endl;

    return 0;
}

int countWords(char *sentence)
{
    int words= 1;
    while(*sentence != '\0')
    {
        if(*sentence == ' ')
            words++;
        sentence++;
    }
    return words;
}

4 个答案:

答案 0 :(得分:1)

除非像家庭作业那样禁止这样做,否则你几乎肯定希望使用std::string以及与std::getline一起使用的std::string版本而不是原始缓冲区炭:

std::string s;
std::getline(std::cin, s);

然后你可以通过将这些单词填入std::istringstream来计算单词,并从那里读出单词:

std::istringstream buffer(s);
auto word_count = std::count(std::istream_iterator<std::string>(s), 
                             std::istream_iterator<std::string());

要打印出单词及其长度,您可以(例如)使用std::for_each代替:

int count = 0;
std::for_each(std::istream_iterator<std::string>(s),
              std::istream_iterator<std::string>(),
              [&](std::string const &s) { 
                  std::cout << s << " " << s.size();
                  ++count;});

答案 1 :(得分:0)

你可以在这里激励。基本上使用std::getline来阅读std::cinstd::string

#include <iostream>
#include <string>
#include <cctype>

inline void printWordInfo(std::string& word) {

    std::cout << "WORD: " << word << ", CHARS: " << word.length() << std::endl;

}

void printInfo(std::string& line) {

    bool space = false;
    int words = 0;
    int chars = 0;
    std::string current_word;


    for(std::string::iterator it = line.begin(); it != line.end(); ++it) {

        char c = *it;

        if (isspace(c)) {

            if (!space) {

                printWordInfo(current_word);
                current_word.clear();
                space = true;
                words++;

            }
        }
        else {

            space = false;
            chars++;
            current_word.push_back(c);

        }

    }

    if (current_word.length()) {

        words++;
        printWordInfo(current_word);

    }

    if (words) {

        std::cout << "AVERAGE:" << (double)chars/words << std::endl;

    }

}

int main(int argc, char * argv[]) {

    std::string line;

    std::getline(std::cin, line);

    printInfo(line);

    return 0;

}

答案 2 :(得分:0)

沿着你已有的方向前进:

你可以定义一个countCharacters函数,就像你的countWords:

int countCharacters(char *sentence)
{
  int i;
  char word[size];
  for(i = 0; sentence[i] != ' '; i++) //iterate via index
  {
    word[i] = sentence[i];   //save the current word
    i++;
  }
  cout <<word<< <<i<<endl; //print word & number of chars
  return i;
}

你可以在你的countWords函数中调用

int countWords(char *sentence)
{
  int words = 1;
  for(int i; sentence[i] != '\0';) //again this for loop, but without
                                   //increasing i automatically
  {
     if(sentence[i] == ' ') {
       i += countCharacters(sentence[++i]);  //move i one forward to skip
                                             // the space, and then move 
                                             // i with the amount of 
                                             // characters we just counted
       words++;                              
     }
     else i++;
  }
  return words;
}

答案 3 :(得分:0)

这应该与您的要求相差无几 - 我只对您现有的代码进行了最小的修改。

限制:

  • 你最好用

    string line;
    getline(cin, line);
    

    读取行以接受任何大小的行

  • 我现在的代码假设

    • 行的开头或结尾没有空格
    • 两个单词之间的单个空格

    应该改进以应对额外的空间,但我把它作为练习留给你: - )

代码:

#include <iostream>
#include <string>
#include <cstring>

using namespace std;

int countWords(char *sentence, double& average);

int main()
{
const int size=80;
char word[size];
double average=0;
cout<<"Enter words less than " <<size-1<<" characters."<<endl;
cin.getline(word, size);
cout <<"There are "<<countWords(word, average)<<" words in the sentence."<<endl;
cout << "Average of the sentence " << average << endl;
return 0;
}

int countWords(char *sentence, double& average)
{
int words= 1;
int wordlen;
char *word = NULL;
while(*sentence != '\0')
{
    if(*sentence == ' ') {
        words++;
        wordlen = sentence - word;
        average += wordlen;
        *sentence = '\0';
        cout << word << " " << wordlen<< endl;  
        word = NULL;
    }
    else if (word == NULL) word = sentence;
    sentence++;
}
wordlen = sentence - word;
average += wordlen;
cout << word << " " << wordlen<< endl;  
average /= words;
return words;

}

输入:super great cannon boys

输出是:

Enter words less than 79 characters.
super great cannon boys
super 5
great 5
cannon 6
boys 4
There are 4 words in the sentence.
Average of the sentence 5