#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. можете ли вы показать, как именно выглядит код в описанном вами случае?