Как правильно инициализировать указатель на массив символов? - PullRequest
0 голосов
/ 28 марта 2019

Мне нужна помощь для этой функции сортировки.Цель этой функции - создать массив указателей на символ, чтобы пользователь мог заполнить его несколькими словами и вернуть обратно в алфавитном порядке.Это часть кода:

void Sort(bool flag)
{
if(flag == false)
{
    //ordina stringhe
    int NumString = 0;

    cout<<"Number of strings: ";
    cin>>NumString; //!!
    char *Vector[NumString];

    for(int i=0;i<NumString;i++)
    {
        cout<<"Insert the "<<i<<" element: ";
        cin>>Vector[i];

        int Val = 0;
        char* swap;

        for(int i=0;i<NumString;i++)
        {
            for(int j=0;j<NumString;j++)
            {
                Val = strcmp(Vector[i],Vector[j]);

                if(Val > 0)
                {
                   swap = Vector[i];
                   Vector[i]=Vector[j];
                   Vector[j]=swap;
                }
            }
        }

        for(int i=0;i<NumString;i++)
        {
            cout<<Vector[i];
            cout<<endl;
        }
    }
}

И когда я пытаюсь запустить его, я получаю эту ошибку, но я не понимаю, почему.Это выходные данные программы:

Количество строк: 3 Вставить элемент 0: сбой чтения abc из мастера: ошибка ввода / вывода RUN FAILED (значение выхода 1, общее время: 7 с)

1 Ответ

0 голосов
/ 28 марта 2019

char *Vector[NumString] определяется как массив указателей на символы. Подробнее об этом: https://www.codeproject.com/Articles/7042/How-to-interpret-complex-C-C-declarations

Поскольку ни один из элементов char* не инициализирован, ваша программа делает недопустимый доступ к памяти при попытке cin и закрывается / вылетает.

Чтобы избежать этого, вы можете вместо этого использовать std::string, который позаботится о выделении памяти для вас.

Edit: Если вы должны использовать массивы символов, вы можете сделать следующее: Вы можете предварительно выделить длины массива char следующим образом: char Vector[numString][noteLength]. Тогда используйте std::cin >> std::setw(noteLength) >> Vector[i].

Вы также можете динамически распределять указатели, используя предыдущее определение char *Vector[NumString] и вызывая Vector[i] = new char[noteLength]. Не забудьте позвонить delete Vector[i], когда закончите!

Вы также должны были бы #include <iomanip> использовать std::setw

...