1 Востаннє редагувалося lilika (08.06.2022 12:04:00)

Тема: Покажчик на покажчик + динамічне виділення пам'яті + char* src в VS!

#include <iostream>
#include <cstring>
#include "string.h"
#include <string.h>
#include <stdio.h>
//#include <stdlib.h>
#include <iomanip>


using namespace std;

char** AddPtr(char** pp, int size, char* str); //прототип функції

int main(int argc, char* argv[])
{
    setlocale(LC_ALL, "rus");

    int size = 0;
    char** pp = 0;

    cout << "~~~~~Добав~~~~~" << endl;

    char* src1 = "11111111111111111";
    char* src2 = "22222222222222222";
    char* src3 = "33333333333333333";
    char* src4 = "44444444444444444";
    char* src5 = "55555555555555555";

    
    pp = AddPtr(pp, size, src1);
    size++; //=1  

    pp = AddPtr(pp, size, src2);
    size++;  //2

    pp = AddPtr(pp, size, src3);
    size++;  //3

    pp = AddPtr(pp, size, src4);
    size++;  //4

    pp = AddPtr(pp, size, src5);
    size++;  //5

    for (int i = 0; i < size; i++)    
        cout << pp[i] << endl;  
    cout << endl;

    for (int i = 0; i < size; i++) 
    {
        delete[] pp[i];   
    }
    delete[] pp; 
    return 0;
}

char** AddPtr(char** pp, int size, char* str)
{
    if (size == 0) {
        pp = new char* [size + 1]; 
    }
    else {   
        char** copy = new char* [size + 1]; 
        for (int i = 0; i < size; i++) 
        {
            copy[i] = pp[i];
        }
        

        delete[] pp; 

        pp = copy; 
    }

    pp[size] = new char[strlen(str) + 1];  
    strcpy_s(pp[size], sizeof pp[size], str);  

    return pp;
}

2 Востаннє редагувалося lilika (08.06.2022 12:09:07)

Re: Покажчик на покажчик + динамічне виділення пам'яті + char* src в VS!

Треба було дописати const char* str); //прототип функції

#include <iostream>
#include <string.h>

using namespace std;

char** AddPtr(char** pp, int size, const char* str); //прототип функції

int main()
{
    setlocale(LC_ALL, "rus");

    int size = 0; //кількість вказівників на строки
    char** pp = nullptr; //вказівник на массив вказівників, які містять адреса строчок

    cout << "~~~~~Додаєм вказівники на пять строчок и заповнюєм строчки даними~~~~~" << endl;
    //виклик функції 
    pp = AddPtr(pp, size, "11111111111111111");
    size++; //=1  збільшуєм кількість массива вказівників

    pp = AddPtr(pp, size, "22222222222222222");
    size++;  //2

    pp = AddPtr(pp, size, "33333333333333333");
    size++;  //3

    pp = AddPtr(pp, size, "44444444444444444");
    size++;  //4

    pp = AddPtr(pp, size, "55555555555555555");
    size++;  //5

    for (int i = 0; i < size; i++)    
        cout << pp[i] << endl;  
    cout << endl;

    for (int i = 0; i < size; i++) 
        delete[] pp[i]; // 
    }
    delete[] pp; // потом 

    system("pause");
    return 0;
}

char** AddPtr(char** pp, int size, const char* str)
{
    if (size == 0) {
        pp = new char* [size + 1]; 
    }
    else {   
        char** copy = new char* [size + 1]; 
        for (int i = 0; i < size; i++) 
        {
            copy[i] = pp[i];
        }
        

        delete[] pp; 

        pp = copy; 
    }

    /*
    pp[size] = new char[strlen(str) + 1];  
    strcpy_s(pp[size], strlen(str) + 1, str);  
    */

    size_t len = strlen(str);
    pp[size] = new char[len + 1];  
    strcpy_s(pp[size], len + 1, str);  

    return pp;
}

3 Востаннє редагувалося lilika (08.06.2022 12:13:34)

Re: Покажчик на покажчик + динамічне виділення пам'яті + char* src в VS!

Проблема переповнення буферу char** copy в Visual Studio!

#include <iostream>
#include <string.h>
using namespace std;
 

char** AddPtr(char** pp, int size, const char* str);
char** DelPtr(char** pp, int size, int ncell); 
char** InsPtr(char** pp, int size, int ncell, const char* str); 
 
int main()
{
    setlocale(LC_ALL, "rus");
 
    int size = 0;
    char** pp = 0;
 
    cout << "~~~~~Додаєм~~~~~" << endl;
    pp = AddPtr(pp, size, "11111111111111111");
    size++; //1
 
    pp = AddPtr(pp, size, "22222222222222222");
    size++;//2
 
    pp = AddPtr(pp, size, "33333333333333333");
    size++;//3
 
    pp = AddPtr(pp, size, "44444444444444444");
    size++;//4
 
    pp = AddPtr(pp, size, "55555555555555555");
    size++;//5
 
    for (int i = 0; i < size; i++)    
    cout << endl;
 
    cout << "~~~~~Видаляєм 3 стрічку~~~~~" << endl;
    pp = DelPtr(pp, size, 2); 
    size--; //4
 
    for (int i = 0; i < size; i++) 
        cout << pp[i] << endl;
    cout << endl;
 
    cout << "~~~~~Додаєм вказівник ~~~~~" << endl;
    pp = InsPtr(pp, size, 2, "333"); 
    size++; //5
    for (int i = 0; i < size; i++) 
    cout << endl;
 
    
    for (int i = 0; i < size; i++)
    {
        delete[] pp[i];
    }
 
    delete[] pp;
 
    system("pause");
    return 0;
}
 
char** AddPtr(char** pp, int size, const char* str)
{
    if (size == 0) {
        pp = new char* [size + 1];
    }
    else {
        char** copy = new char* [size + 1];
        for (int i = 0; i < size; i++)
        {
            copy[i] = pp[i];
        }
 
        delete[] pp;
        pp = copy;
    }
    size_t len = strlen(str);
    pp[size] = new char[len + 1];
    strcpy_s(pp[size], len + 1, str);
 
    return pp;
}
 
char** DelPtr(char** pp, int size, int ncell)
{
    char** copy = new char* [size - 1]; 
        
    for (int i = 0; i < ncell; i++)
    {
        copy[i] = pp[i];
    }
    for (int i = ncell; i < size - 1; i++)
    {
        copy[i] = pp[i + 1];
    }
 
    delete[] pp[ncell]; 
    delete[] pp; 
    pp = copy; 
    return pp;
}
 
char** InsPtr(char** pp, int size, int ncell, const char* str)
{
    char** copy = new char* [size + 1];
    for (int i = 0; i < ncell; i++)
    {
        copy[i] = pp[i];
    }
 
    size_t len = strlen(str);
    copy[ncell] = new char[len + 1]; 
    strcpy_s(copy[ncell], len + 1, str);
 
    for (int i = ncell + 1; i < size + 1; i++)
    {
        copy[i] = pp[i - 1];
    }
    delete[] pp;
    pp = copy;
 
    return pp;
}

4 Востаннє редагувалося lilika (08.06.2022 12:01:47)

Re: Покажчик на покажчик + динамічне виділення пам'яті + char* src в VS!

Зверху приклад виконується але попереджає про переповнення буфера в майбутньому!

5

Re: Покажчик на покажчик + динамічне виділення пам'яті + char* src в VS!

Надав вам можливість редагувати власні дописи.
Приведіть цю тему у відповідність до п.1.1 Правил.

6

Re: Покажчик на покажчик + динамічне виділення пам'яті + char* src в VS!

    char* src1 = static_cast<char>("11111111111111111");

Нечасто я бачив такий відвертий постріл собі в ногу... Вас не засмучує, що ліворуч від = char *, а праворуч - char?

7 Востаннє редагувалося lilika (08.06.2022 12:10:51)

Re: Покажчик на покажчик + динамічне виділення пам'яті + char* src в VS!

Взяті приклади для адаптації для Visual Studio!
http://cppstudio.com/uk/post/9555/
http://cppstudio.com/uk/post/9605/