c ++文本分开和统计单词

时间:2013-12-02 22:30:29

标签: c++ text countdown words

我的任务是输入一个文本,输出必须是包含2,3,4 ... n个字母的单词数,如下所示:

你好,唔是我的老鼠。 2 0 1 2

符号'',',',';'и'。'计为单词分隔符。 你能帮我完成这个任务吗?我有这个代码,但你可以帮我修复错误吗?

    #include <iostream>
    #include <string>
    using namespace std;

    int main()
    {
    string text="";
    int size, maxword=0;

    getline(cin, text);
    std::string bb=text;
    size=text.size();
    int b=size;
    int v=size, br=0, t=0, c=0;
    int i=0, a[1000]={0};
    do
    {
        if(text[i]==32 || text[i]==44 || text[i]==59 || text[i]==46)
        {
            a[i]++;
            text.erase (0,i+1);
            size=size-i-1;
            i=0;
        }
        else
        {
            i++;
        }
    }
    while(i<size);
    a[text.size()]++;

    //maxword=broqt bukvi na nai golqmata vsichki bukvi, do predposlednata duma ot teksta
    for(int k=0;k<b;k++)
    {
        if(text[k]==32 || text[k]==44 || text[k]==59 || text[k]==46)
        {
            maxword=k;
            br++;
        }
        if(br==1) break;
    }

    //t=broqt bukvi na poslednata duma ot teksta
    for(int k=b-1;k>=0;k--)
    {
        if(c>0) break;
        else
        {
        if(bb[k]==32 || bb[k]==44 || bb[k]==59 || bb[k]==46)
        {
            for(int m=k+1;m<b;m++)
            {
            t++;
            }
            c++;
        }
        }
    }

    //sravnqva t i maxword, za da vidi broqt bukvi na nai golqmata duma ot teksta
    if(maxword<t) maxword=t;

    for(int y=2;y<maxword+1;y++)
    {
    cout<<a[y]<<endl;
    }
    system("pause");
    return 0;
    }

1 个答案:

答案 0 :(得分:1)

我建议在这里使用std::map而不是固定大小(a[1000])的大数组 - 以简化程序,使其更安全(不需要越界检查)并保存记忆。最好的:它可以像[]运算符

的数组一样被索引

您的第二个和第三个循环是冗余的并且不是必需的 - 只需要一个循环来计算长度(另一个循环用于输出程序结束时的长度)。

还要注意以下几点: 而不是使用ascii ' '';''.'','的常量,您可以使用字符常量 - 它更容易理解并提高可读性。 size_t是一个方便的无符号类型,可以保存任何数组/字符串的长度 - 在正常情况下(负长度)永远不能签署大小/长度 - 所以最好在那里使用无符号类型。 并清除wordCount之类的变量名称,使代码比ba更容易呈现。因此我不得不在代码中进行相当多的更改,因为我无法理解您在那里尝试做什么。

考虑一下:

#include <iostream>
#include <string>
#include <map>

int main(int argc, const char * argv[]){
  std::string text="";
  size_t pos = 0, count_chars = 0, max_chars = 0;
  std::map<size_t, size_t> wordCount;
  std::getline(std::cin, text);
  do{
    if((text[pos] == ' ') || (text[pos] == ';') || (text[pos] == ',') || (text[pos]=='.')){
      if(count_chars > max_chars) max_chars = count_chars;
      wordCount[count_chars]++;
      count_chars = 0;
    }else{
      count_chars++;
    }
    pos++;
  }while(pos < text.size());
  for(size_t i = 2 ; i < max_chars + 1; i++){
    std::cout << wordCount[i] << std::endl;
  }
  system("pause");
  return 0;
}

输入:

Hello, whis is my mouse.

输出:

2
0
1
2

但要小心:如果你的输入在鼠标之后没有最后的.,它就不能用这种方式识别最后一个单词 - 但这很容易修复:你可以这样做

if(count_chars>0) wordCount[count_chars]++;

在第一个循环之后(do-while)。如果您对此有任何疑问,请随时提出。