Как правильно инициализировать указатель на массив символов?

#c #sorting #char

#c #сортировка #символ

Вопрос:

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

 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 из master: ошибка ввода / вывода СБОЙ ЗАПУСКА (значение выхода 1, общее время: 7 секунд)

Комментарии:

1. Используйте std::string вместо char* . С char* вам приходится выделять и освобождать память вручную (чего вы здесь не делаете), и нет хорошего способа узнать, сколько выделить.

2. cin>>Vector[i]; не делает того, чего вы от него ожидаете.

3. VLA не соответствуют C : char *Vector[NumString];

4. Это не массив строк, это массив указателей на char

Ответ №1:

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

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

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

Редактировать: Если вы должны использовать массивы символов, вы можете сделать следующее: вы можете предварительно выделить 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

Комментарии:

1. хорошо, большое спасибо за статью. К сожалению, я не могу использовать строку, а только указатели.

2. в первом решении замена слов выполняется только для первого символа. Со вторым компилятор выдает ту же ошибку

3. можете ли вы показать, как именно выглядит код в описанном вами случае?