簡體   English   中英

增量數組

[英]Increment Array

我試圖在用戶輸入中出現字母'a'時遞增數組( alphabet[0] )索引,但是當我打印出alphabet[0]我收到了錯誤的輸出。

示例問題:

"Enter a string" 

adam //input 

2665453 //printed on screen
2665453
2665453
2665453
2665453

我試圖實現的輸出應該是數字2,對於adam中的2'a。

這是我的代碼:

class Counter {

    public:
        string input; //the string used for user input
        int alphabet[26];
        int numbers[10];
    void countcharacters();
    void countnumbers();

    private:
};

void Counter::countcharacters() {
    cout << "Enter a string" <<endl;
    getline(cin, input);

    for(int i=0; i<input.length(); i++) {
        if(input.at(i) == 'a'){
            alphabet[0]++;
        }
    cout << alphabet[0] << endl;
    }
}

問題很簡單。 你的記憶沒有被初始化。 您的數組包含具有錯誤值的int。 在您的計數器類的構造函數中,將它們全部設置為0。

您可以使用算法標題中的std :: fill輕松完成此操作。 有關它的文檔可以在這里找到。

class Counter{

public:
    Counter()
    {
        std::fill(std::begin(alphabet), std::end(alphabet), 0); // C++11
        std::fill(alphabet, alphabet + 10, 0); // c++03
    }

    // The rest of your class goes here
};

可以在迭代器頭中找到std::beginstd::end模板。

這里還有一個控制輸入的示例,並將每個計數存儲在它所計算的字符上:

////////////////////////////
// AlphaNumCounter.h
////////////////////////////


#ifndef ALPHANUMCOUNTER_H
#define ALPHANUMCOUNTER_H
#include "stdafx.h"
#include <vector>
#include <map>

namespace MyStuff
{
const int NOT_VALID_SEARCH_CHAR = -1;

class AlphaNumCounter
{
public:
    AlphaNumCounter();
    AlphaNumCounter(bool bIsCaseSensitive);

    unsigned int CountOccurance(const std::string &haystack, const char &needle);

    // Debug func that print all the occurances of a character on the last CountOccurance call
    void PrintOccurances()
    {
        for( std::map<char, unsigned int>::iterator pIter = m_mapAlphaNumerics.begin(); pIter != m_mapAlphaNumerics.end(); pIter++)
        {
            char c = (*pIter).first;
            int count = (*pIter).second;

            std::cout << "'" << c << "' had '" << count << "' occurances on last count iteration." << std::endl;
        }
    }

private:
    void Init(); // Shared initializer for all ctor's

    std::map<char, unsigned int> m_mapAlphaNumerics; // A map which holds the number of occurances of char (i.e: ['a'][7], if 'a' was found 7 times )
    bool m_bIsCaseSensitive; // Should 'A' be counted as 'a', and vice versa...?
};
}

#endif // ALPHANUMCOUNTER_H

/////////////////////////////////
// AlphaNumCounter.cpp
/////////////////////////////////


#include "stdafx.h"
#include "AlphaNumCounter.h"
#include <algorithm>

using namespace MyStuff;

AlphaNumCounter::AlphaNumCounter() : m_mapAlphaNumerics(), m_bIsCaseSensitive(false)
{
    Init();
}
AlphaNumCounter::AlphaNumCounter(bool bIsCaseSensitive) : m_mapAlphaNumerics(), m_bIsCaseSensitive(bIsCaseSensitive)
{
    Init();
}

void AlphaNumCounter::Init()
{
    // Store lowercase a - z
    for( char i = 'a'; i <= 'z'; i++ )
        m_mapAlphaNumerics[i] = 0;

    // Store uppercase a-z
    for( char i = 'A'; i <= 'Z'; i++ )
        m_mapAlphaNumerics[i] = 0;

    // Store 0 - 9
    for( char i = '0'; i <= '9'; i++ )
        m_mapAlphaNumerics[i] = 0;
}

unsigned int AlphaNumCounter::CountOccurance(const std::string &haystack, const char &needle)
{
    // If neither a-z || A-Z || 0-9 is being searched for, we return a indication of that.
    if(m_mapAlphaNumerics.find(needle) == m_mapAlphaNumerics.end())
        return NOT_VALID_SEARCH_CHAR;

    char ch = needle;
    std::string sz = haystack;


    // If the check is not case sensitive (i.e: A == a), we make sure both params are lowercase for matching.
    if( !m_bIsCaseSensitive ){
        ch = ::tolower(ch);
        std::transform(sz.begin(), sz.end(), sz.begin(), ::tolower);
    }

    // Count occurances of 'ch' in 'sz' ('needle' in 'haystack')
    std::size_t n = std::count(sz.begin(), sz.end(), ch);

    // The occurances of 'needle' must be set to 'n' for this iteration
    m_mapAlphaNumerics[ch] = n;

    // Also set the uppercase val if its case insensitive. Then both 'a' and 'A' would have the same occurance count.
    if( !m_bIsCaseSensitive )
        m_mapAlphaNumerics[::toupper(ch)] = n;

    return n; // Return the count for convenience of usage
}




//////////////////////
// Main.cpp
//////////////////////


using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    MyStuff::AlphaNumCounter aCounter;
    aCounter.PrintOccurances();

    cout << "\n--------------------------------------------------------------\n";
    cout << "Enter a string: " << std::endl;
    string haystack = string();
    getline(cin, haystack);

    cout << "\nNow enter a single alphanumerical character to count, in that string: " << endl;
    char needle;
    cin >> needle;
    cin.clear();
    cin.ignore( numeric_limits<streamsize> ::max(), '\n');

    while( aCounter.CountOccurance(haystack, needle) == MyStuff::NOT_VALID_SEARCH_CHAR )
    {
        cout << "\nI repeat: enter a single *alphanumerical* character to count, in that string: " << endl;
        cin >> needle;
        cin.clear();
        cin.ignore( numeric_limits<streamsize> ::max(), '\n');
    }

    cout << "\n--------------------------------------------------------------\n";
    aCounter.PrintOccurances();

    system("PAUSE");
    return 0;
}

希望能幫助到你! 此致,Oyvind

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM