Напишите функцию с аргументом типа char*

helloy

Напишите функцию с аргументом типа char*. Функция должна динамически (оператором new) выделять память для массива char, размер которого соответствует размеру переданного символьного массива. Используя механизм индексирования, скопируйте символы из аргумента в динамически созданный массив (не забудьте о завершающем нулевом символе) и верните указатель на копию. Протестируйте функцию в main(), передав ей статический символьный массив, получив результат и снова передав его функции. Выведите обе строки и оба указателя, чтобы убедиться, что они относятся к разным областям памяти. Освободите динамическую память при помощи оператора delete.
#include <iostream>
using namespace std;
 
char * add(char *ch){
    int size=0;
    while(*(ch+size)) size++;
    
    char* mass=new char[size+1];
 
    for(int i=0;i<size;i++){
        mass[i]=ch[i];
        //cout<<mass[i];
    }
 
    mass[size]='\n';
 
    return mass;
}
 
 
void main(){
    char*p;
    p=add("11");
    while(*p)
        cout<<p++;
    delete[]p;
 
}
Может кто исправить мой говнокод?
5 ответов

helloy

#include <iostream>
#include <cstring>
 
char* copy(const char* str)
{
   const size_t length = strlen(str);
   char* dest = new char[length + 1];
   for (size_t i = 0; i < length + 1; ++i)
   {
       dest[i] = str[i];
   }
   return dest;
}
 
int main()
{
    const char* value = "11";
    char* result = copy(value);
    std::cout << value << " " << static_cast<const void*>(value) << " "
    << result << " " << static_cast<void*>(result) << std::endl;
}


helloy

const size_t length = strlen(str); 
char* dest = new char[length + 1]; 
for (size_t i = 0; i < length + 1; ++i)
Я бы наверное в таком случае предпочел вариант:
const size_t size = strlen(str) + 1; 
char* dest = new char[size]; 
for (size_t i = 0; i < size; ++i)
А вообще, есть же strcpy(). Хотя зная размер можно и memcpy(). Но в данном случае вообще strdup()


helloy

Но в данном случае вообще
Функция должна динамически (оператором new) выделять память для массива char, размер которого соответствует размеру переданного символьного массива. Используя механизм индексирования, скопируйте символы из аргумента в динамически созданный массив (не забудьте о завершающем нулевом символе) и верните указатель на копию.
!!!


helloy

Tulosba, Вцелом логично. strcpy/memcpy это понятно, но нужно ж было именно такую копию замутить. А strdup нестандартная функция.


helloy

ForEveR, я начал "лишную" +1 убирать, а там уже процесс пошел лавинообразно