Как подсчитать вхождения каждой цифры в строке, используя int * count (const string & s) в c ++?Примечание: я не могу использовать карты или что-либо еще в библиотеке алгоритмов
Несколько замечаний:
Всегда плохая идея, если мы этого не делаемследуйте простейшему способу решения проблемы, и грустно, что учителя являются инициаторами таких ситуаций.
Нет необходимости в int*
.который не обеспечивает вашего решения в любом случае.Если бы это был массив для подсчета символов вашей строки, то это может иметь смысл (т. Е. Указатель на массив).
Старайтесь избегать практики с using namespace std;
Вы можете сделать что-то вроде следующего, если вам не разрешено использовать std::map<char, int>
(подсказка для вашего альтернативного решения).
Я прокомментировал это, для лучшего понимания.
#include <string>
#include <iostream>
#include <cstddef>
// consider 128 ASCII decimal and their coresponding character codes
int charASCIIArray[128] = {0};
void count_char(const std::string& s)
{
for(const auto& it: s)
{
if(('A' <= it && it <= 'Z') || // if char between (A,B,....,Z) or
('a' <= it && it <= 'z') ) // between (a,b,....,z)
charASCIIArray[static_cast<int>(it)]++; // we count each corresponding array then
}
}
int main()
{
std::string userinput = "random words WITH *- aLl";
count_char(userinput);
for(std::size_t index = 0; index < 128; ++index)
if(charASCIIArray[index] != 0)
std::cout << "Letter " << static_cast<char>(index) // convert back to char
<< " occured " << charASCIIArray[index] << " times.\n";
return 0;
}
Смотрите прямую трансляцию здесь : https://www.ideone.com/uFG2HJ
Letter H occured 1 times.
Letter I occured 1 times.
Letter L occured 1 times.
Letter T occured 1 times.
Letter W occured 1 times.
Letter a occured 2 times.
Letter d occured 2 times.
Letter l occured 1 times.
Letter m occured 1 times.
Letter n occured 1 times.
Letter o occured 2 times.
Letter r occured 2 times.
Letter s occured 1 times.
Letter w occured 1 times.
ОБНОВЛЕНИЕ
Вдохновленный комментарием @Fei Xiang, вот два более инженерных решения:
Во-первых, с возвращением указателя на динамическиймассив (который будет соответствовать фактическим требованиям вопроса): https://www.ideone.com/ouHqK4
#include <string>
#include <iostream>
#include <cstddef>
int* count_char(const std::string& s)
{
// consider 128 ASCII decimal and their coresponding character codes
int *charASCIIArray = new int[128]{0};
for(const auto& it: s)
{
if(('A' <= it && it <= 'Z') || // if char between (A,B,....,Z) or
('a' <= it && it <= 'z') ) // between (a,b,....,z)
charASCIIArray[static_cast<int>(it)]++; // we count each corresponding array then
}
return charASCIIArray;
}
int main()
{
std::string userinput = "random words WITH *- aLl";
int *charASCIIArray = count_char(userinput);
for(std::size_t index = 0; index < 128; ++index)
if(charASCIIArray[index] != 0)
std::cout << "Letter " << static_cast<char>(index) // convert back to char
<< " occured " << charASCIIArray[index] << " times.\n";
delete[] charASCIIArray;
return 0;
}
Во-вторых, с умным указателем (std::unique_ptr
): https://www.ideone.com/dfc62J
#include <string>
#include <iostream>
#include <cstddef>
#include <memory>
#include <utility>
std::unique_ptr<int[]> count_char(const std::string& s)
{
// consider 128 ASCII decimal and their coresponding character codes
std::unique_ptr<int[]> charASCIIArray = std::unique_ptr<int[]>(new int[128]{0});
for (const auto& it : s)
{
if (('A' <= it && it <= 'Z') || // if char between (A,B,....,Z) or
('a' <= it && it <= 'z')) // between (a,b,....,z)
charASCIIArray[static_cast<int>(it)]++; // we count each corresponding array then
}
return std::move(charASCIIArray);
}
int main()
{
std::string userinput = "random words WITH *- aLl";
std::unique_ptr<int[]> charASCIIArray = count_char(userinput);
for (std::size_t index = 0; index < 128; ++index)
if (charASCIIArray[index] != 0)
std::cout << "Letter " << static_cast<char>(index) // convert back to char
<< " occured " << charASCIIArray[index] << " times.\n";
return 0;
}