2017-04-04 12 views
1

私はC++には新しく、与えられた入力テキストストリーム内の印刷可能でない各空白文字の出現を数えることができるプログラム例が与えられています。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; 
} 

だから、基本的にはどのようなIどのようにc私はこのプログラムを修正するか、テキストの文字列(あるいはそれに類するもの)を受け入れて各文字の出現を数えるようにしますか?

+0

何ちょうどあなたが質問している、コマンドラインの引数を使用する方法(チュートリアルや例が何千もありますインターネット)?文字、数字、空白文字を区別する方法([この文字分類基準](http://en.cppreference.com/w/cpp/string/byte#Character_classification))または、他の何か?詳しく教えてください。そして、あなたがまだそれをやっていないなら、[良い質問をする方法を読む](http://stackoverflow.com/help/how-to-ask)に時間をかけてください。 –

+0

また、 '(char)i'は2つの理由から悪いことに注意してください。まず、あなたの範囲内のすべての文字が印刷可能ではないということです。 2番目の理由は、CスタイルのキャストをC++で使うべきではないからです(代わりに 'static_cast'を使用してください。*文字が印刷可能な場合)。 –

答えて

0

std::cinから行を入力できるようにstd::getlineを使用して、すでに持っているのと同様の方法で処理することができます。簡単にするためにI:

#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

0

それはあなたが考えてみれば、実際に非常に簡単です:

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

あなたは、引数として文字列を取得する必要がある場合:

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]); 
    } 
} 
関連する問題