字数 - 忽略/减去双重空格

时间:2017-01-24 22:30:58

标签: c++ string codeblocks fstream

我正在努力学习一些编码以扩大我的知识范围,而且我似乎遇到了一些难题。

我正在尝试创建一个程序来输出正在从文件中读取的字符数,数字,标点符号,空格,单词和行。

以下是我正在阅读的文字文件。

  See Jack run. Jack can run fast. Jack runs after the cat. The cat's fur is black. See Jack catch the cat.
  Jack says, "I caught the cat."
  The cat says, "Meow!"
  Jack has caught 1 meowing cat. Jack wants 5 cats, but can't find any more.

这是我的代码

  #include <iostream>
  #include <fstream>

  using namespace std;

  int main()
  {
  ifstream lab3;
  string word;
  lab3.open("lab3.txt");
  int countletters=0,countnum=0,countpunc=0,countspace=0,words=0,line=0;
  char character;
  if(!lab3)
  {
  cout << "Could not open file" << endl;
  return 1;
  }
  while(lab3.get(character) && !lab3.eof())
  {
  if(isalpha(character))
  {
  countletters++;
  }
  if (isdigit(character))
  {
  countnum++;
  }
  if (ispunct(character))
  {
  countpunc++;
  }
  if (isspace(character))
  {
  countspace++;
  }
  if (isalpha(character) && (isspace(character++) || ispunct(character++)))
  {
  words++;
  }
  if(character=='\n')
  {
  line++;
  }
  }
  cout << "There are " << countletters << " letters." << endl;
  cout << "There are " << countnum << " numbers." << endl;
  cout << "There are " << countpunc << " punctuations." << endl;
  cout << "There are " << countspace << " spaces." << endl;
  cout << "There are " << words << " words." << endl;
  cout << "There are " << line << " sentences." << endl;
  lab3.close();
  return 0;
  }

输出:

There are 167 letters.
There are 2 numbers.
There are 18 punctuations.
There are 52 spaces.
There are 0 words.
There are 4 sentences.

我希望学到的一些事情:

  1. 解释为什么单词计数不起作用,并考虑到双重空格替换工作代码。
  2. 为了学习目的/效率而改进我的代码的建议。
  3. 从文本文件中读取信息的说明。无论你的字母,数字,标点符号是否可以用来进行这种类型的编码。
  4. 我所知道的一些事情:

    1. using namespace std;不是一个好习惯 - 实际应用的最佳做法是什么。
    2. 我是初学者,这可能不一定不是作物编码的精华
    3. `提前感谢您的帮助和建议:)

2 个答案:

答案 0 :(得分:0)

我无法评论,所以我发布了一个答案,但我知道这不是一个真正的答案,因为我指的是另一个帖子。

计算白色空间的匹配就像他们在这里做的那样会给你一个字数......

Count number of matches

您也可以修改此解决方案以计算其他项目。

没有正则表达式...... 由于您循环遍历字符,因此您可以设置一个标记来跟踪空格,并在到达另一个非空格时增加字数。

我相信在你的代码中添加这个替换你的wordcount和你的spacecount部分应该工作。你需要在顶部添加一个名为spaceflag的int。您可能需要在单词计数中添加一个以获得准确的总数。

  if (isspace(character))
  {
  countspace++;
  spaceflag = 1;
  }
  else  //else says it's not a space.
  {
  if(spaceflag == 1) //if the spaceflag has been set and we run into a different type of character then we've made it to a new word.
    words++;
    spaceflag = 0; //reset the spaceflag until next one is found.
  }
  if(character=='\n')

答案 1 :(得分:0)

因为获取下一个字符的方法是lab3.get(character),所以增加单词计数检查中的字符不会获得下一个字符,只会改变你拥有的字符的值。

不要试图“向前看”,而是考虑保留最后一个字符读取并检查它以检测下一次迭代中单词的结尾。

if (ispunct(character)) { countpunc++; if (isaalpha(prevchar)) { words++; }
} if (isspace(character)) { countspace++; if (isaalpha(prevchar)) { words++; }
}

在循环开始之前将prevchar初始化为零,然后在所有检查之后在循环内设置等于character

另请注意,您的数字检查确实是捕获数字,因此数据中的值10将计为输出中的2个数字而不是1。