【问题标题】:C++ Program - input text streamC++ 程序 - 输入文本流
【发布时间】:2017-08-29 05:39:18
【问题描述】:

我是 C++ 新手,我得到了一个示例程序,它应该能够计算给定输入文本流中每个可打印非空白字符的出现次数。

显然,我打算用命令参数做一些事情,但是我尝试了这个,但没有得到任何输出。

这是程序:

CharacterCounter.h

#pragma once
#include <iostream>

class CharacterCounter
{
private:
    int fTotalNumberOfCharacters;
    int fCharacterCounts[256];

public:
  CharacterCounter();

  void count( unsigned char aCharacter );

  friend std::ostream& operator<<( std::ostream& aOStream, 
                               const CharacterCounter& aCharacterCounter );
};

CharacterCounter.cpp:

#include "CharacterCounter.h"

using namespace std;

CharacterCounter::CharacterCounter(): fTotalNumberOfCharacters( 0 ),
                                  fCharacterCounts()
{}

void CharacterCounter::count( unsigned char aCharacter )
{
    fCharacterCounts[aCharacter]++;
    fTotalNumberOfCharacters++;
}

ostream& operator<<( ostream& aOStream, const CharacterCounter& aCharacterCounter )
{
    aOStream << "Character counts for " 
             << aCharacterCounter.fTotalNumberOfCharacters << " characters:"<< endl;

    for ( int i = 0; i < 256; i++ )
    {
        if ( aCharacterCounter.fCharacterCounts[i] != 0 )
        {
            aOStream << (char)i << ":\t" << aCharacterCounter.fCharacterCounts[i] << endl;
        }
    }

    return aOStream;
}

Main.cpp:

#include "CharacterCounter.h"

using namespace std;

int main()
{
    CharacterCounter lCounter;

    unsigned char lChar;

    while ( cin >> lChar )
    {
        lCounter.count( lChar );
    }

    cout << lCounter;

    return 0;
}

所以,基本上我要问的是如何修改这个程序,或者让它接受一串文本(或类似的东西)并计算每个字符的出现次数?

【问题讨论】:

  • 您到底在问什么,如何使用命令行参数(互联网上有成千上万的教程和示例)?如何区分字母、数字、空白字符(this characters classification reference 应该有帮助)?或者是其他东西?请详细说明。如果您还没有这样做,请花点时间read about how to ask good questions
  • 还要注意(char)i 不好有两个原因:首先是不是您范围内的所有字符都是可打印的;第二个是因为你不应该在 C++ 中使用 C 风格的转换(使用 static_cast 代替,if 字符是可打印的)。

标签: c++ file-io io


【解决方案1】:

您可以使用std::getline 允许从std::cin 输入一行,然后以类似于您已有的方式处理它。为简单起见,我:

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

int main() {
    std::map<char, size_t> count;

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

    for (char i : s)
    {
        ++count[i];
    }

    for (auto i : count)
    {
        std::cout << i.first  << " : " << i.second << std::endl;
    }
}

在线here

【讨论】:

    【解决方案2】:

    仔细想想其实非常简单:

    CharacterCounter count_string_chars( const std::string& line )
    {
        CharacterCounter counter;
        for( std::size_t i = 0; i < line.size(); ++i )
        {
            counter.count( line.at(i) );
        }
        return counter;
    }
    

    【讨论】:

      【解决方案3】:

      如果你需要获取字符串作为参数:

      int main(int argc, char*argv[])
      {
          CharacterCounter lCounter;
      
          string str;
          if (argc >= 2)
          {
             std::string temp(argv[1]);
             str = temp;
          }
      
         for (size_t i = 0; i < str.size(); i++)
         {
              lCounter.count( str[i]);
         }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-26
        • 2010-09-24
        • 1970-01-01
        • 1970-01-01
        • 2019-04-11
        • 2019-07-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多