2017-04-04 72 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; 
} 

所以,基本上我我問的是如何c我修改這個程序,或者讓它接受一串文本(或類似的東西)並計算每個字符的出現?

+0

什麼你究竟在問,如何使用命令行參數(全世界有成千上萬的教程和例子互聯網)?如何區分字母,數字,空白字符([這個字符分類參考](http://en.cppreference.com/w/cpp/string/byte#Character_classification)應該有幫助)?或者是其他東西?請詳細說明。如果你還沒有完成,請花一些時間[閱讀如何提出好問題](http://stackoverflow.com/help/how-to-ask)。 –

+0

另請注意,'(char)i'因爲兩個原因而不好:第一,並非所有範圍內的所有字符都是可打印的;第二,因爲你不應該在C++中使用C風格的轉換(使用'static_cast'代替*,如果*字符是可打印的)。 –

回答

0

您可以使用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

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]); 
    } 
}