void MyIntToChar(int *arrayOfInt, char* output);
Это неправильно несколькими способами. Во-первых, это неправильно. Вы не можете, в общем, преобразовать целое число в один символ, потому что только десять из всех промежуточных звеньев (0
... 9
) будут вписываться в один. Поэтому я предполагаю, что вы хотите преобразовать целые числа в _strings.
Затем, если вы передаете массивы в функции, они распадаются на указатели на их первый элемент, и вся информация о размере массива теряется. Итак, когда вы передаете массивы для работы, вам также нужно передать информацию о размере.
Либо использовать путь C делать это и передать количество элементов в std::size_t
(быть получены sizeof(myarray)/sizeof(myarray[0])
):
void MyIntToStr(int *arrayOfInt, std::size_t arraySize, char* output);
Или это C++ путь и пройти в двух итераторы, один указывающего на первый элемент (так называемый начинают итератор), а другой указывая на один за последний (конечный итератор):
void MyIntToStr(int *begin, int *end, char* output);
Вы можете улучшить, что, не настаивая на итераторы будучи int*
, но ничего, что, когда разыменовании дает int
:
template< typename FwdIt >
void MyIntToStr(FwdIt begin, FwdIt end, char* output);
(. Шаблоны потребуется вам реализовать алгоритм в заголовке)
Тогда возникают проблемы с выходом. Прежде всего, вы действительно ожидаете все цифры, которые будут записаны в одна строка? Если да, то как они должны быть разделены? Ничего? Пробелы? Запятая?
Или вы ожидаете возвращения массива строк?
Предполагая, что вы действительно хотите одну строку, если я передать массив {1, 2, 3, 4, 5}
в вашу функцию, она нуждается в пространстве для пяти однозначных чисел плюс пространство, необходимое для четырех сепараторов. Ваша подпись функции предполагает, что вы хотите, чтобы я выделил этот аванс, но, честно говоря, если я должен сам это рассчитать, я бы тоже сам сделал конверсии. Кроме того, я не могу сказать вам, сколько памяти это char*
, поэтому вы не можете проверить, был ли я прав. Как выяснили поколения разработчиков, так сложно каждый раз получать право, что несколько компьютерных языков были изобретены, чтобы облегчить программистам работу. Одним из них является C++, который в настоящее время поставляется с динамическим изменением размера строкового класса.
Было бы намного проще (для вас и для меня), если я мог бы передать вам stirng и вы пишете в том, что:
template< typename FwdIt >
void MyIntToChar(FwdIt begin, FwdIt end, std::string& output);
Обратите внимание, что я это передает строку за не- const
ссылки. Это позволяет вам изменить мою строку и позволить мне видеть сделанные вами изменения.
Однако после того, как мы делаем это, вы могли бы точно так же возвращают новую строку вместо requireing меня передать один к вам:
template< typename FwdIt >
std::string MyIntToChar(FwdIt begin, FwdIt end);
Если, однако, вы на самом деле нужен был массив строк, вы не должны брать одну строку для записи, но это значит, где их записать. Наивный способ сделать это - передать динамически переопределяемый массив динамически переопределяемой строки. В C++ это пишется std::vector<std::string>
:
template< typename FwdIt >
void MyIntToStr(FwdIt begin, FwdIt end, std::vector<std::string>& output);
Опять же, это может быть лучше вы вернуть такой массив (хотя некоторые не согласятся, так как копирование массив строки можно считать дорогим).Однако лучший способ сделать это не потребует от меня принятия результата в виде «std :: vector». Что делать, если мне нужны строки в (связанном) списке? Или написано в какой-то поток?
Лучший способ сделать это будет для вашей функции, чтобы принять выходной итератор, к которому вы пишете свой результат:
template< typename FwdIt, typename OutIt >
void MyIntToStr(FwdIt begin, FwdIt end, OutIt output);
Конечно, теперь это так вообще, что это трудно понять, что он делает, так что хорошо, что мы дали ему хорошее имя. Однако, глядя на это, я сразу думаю, что это должно основываться на другой функции, которая нужна, вероятно, даже больше, чем эта: функция, которая принимает один целое число и преобразует его в один строка. Если предположить, что у нас есть такая функция:
std::string MyIntToStr(int i);
это очень легко реализовать версии массива:
template< typename FwdIt, typename OutIt >
void MyIntToStr(FwdIt begin, FwdIt end, OutIt output)
{
while(begin != end)
*output++ = MyIntToStr(*begin++);
}
Теперь все, что вам остается сделать, это реализовать эту функцию std::string MyIntToStr(int i);
. Как уже писал кто-то еще, это легко сделать, используя строковые потоки, и у вас не должно возникнуть проблемы, чтобы найти хорошие примеры для этого. Тем не менее, это даже легче найти плохие примеры, так что я предпочел бы дать вам один здесь:
std::string MyIntToStr(int i);
{
std::ostringstream oss;
oss << i:
if(!oss) throw "bah!"; // put your error reporting mechanism here
return oss.str();
}
Конечно, данные шаблоны, которые легко обобщается принимать что-либо, что это поточное:
template< typename T >
std::string MyIntToStr(const T& obj);
{
std::ostringstream oss;
oss << obj:
if(!oss) throw "bah!"; // put your error reporting mechanism here
return oss.str();
}
Обратите внимание, что, учитывая этот шаблон общей функции, MyIntToStr()
, работающий с массивами, теперь автоматически работает на массивах любого типа, на которых работает шаблон функции, работающий над одним объектом.
Таким образом, в конце этого (а эпическое, я Извинения) путешествие, это то, что мы достигли: обобщенный шаблон функции для преобразования ничего (которое можно записать в поток) в строку, и обобщенный шаблон функции для преобразования содержимого любого массива объектов (который может быть записан в поток) в поток.
Обратите внимание, что, если вы имели, по крайней мере дюжину 90mins лекции на C++ и ваши преподаватели не смогли научить вас достаточно, по крайней мерепонять, что я написал здесь, у вас естьнехорошо преподавали в соответствии с современными стандартами обучения на С ++.
Какая неприязнь к std :: string и std :: vector?(Хотя, если вы считаете, что такая штука выйдет в тесте, достаточно справедливо) – Yacoby
Является ли 'void MyIntToChar (int * arrayOfInt, char * output)' частью присваивания, потому что он выглядит как C мне, 'void MyIntToChar (std :: vector in, std :: string out) 'больше похож на CPP для меня. Вы также должны уточнить свой вопрос. –
2010-08-29 09:25:28
Я уверен, что тест пропускает std :: string и vector. Я хочу, чтобы мои базы были покрыты, а затем (если у меня есть время) просмотрите контейнеры и класс строк в STL –