Ну, как часть изучения C ++, у моего проекта есть ограничение. Мне не разрешено использовать какие-либо библиотеки, кроме базовых, таких как <cstring>
и некоторых других необходимых.
Проект должен принимать входные данные из файла, состоящего из n строк столбцов строк, и иметь возможность сортировать выходные данные в соответствии с лексикографическим порядком любого выбранного столбца. Так, например, с учетом ввода
Cartwright Wendy 93
Williamson Mark 81
Thompson Mark 100
Anderson John 76
Turner Dennis 56
Должен сортировать их по столбцам. И мой поиск по StackOverflow вернул результат от кого-то, кто тоже должен был сделать тот же проект несколько лет назад. Хахаха Qsort, основанный на столбце в c-строке?
Но в моем случае я просто использую глобальную переменную для столбца и продолжаю жизнь. Моя проблема возникла при реализации функции сравнения для qsort
В моем основном методе я называю
qsort (data, i, sizeof(char*), compare);
, где data - это char * data[]
, а i
- количество строк для сравнения. (В данном случае 5)
Ниже приведен мой код для метода сравнения
int compare (const void * a, const void * b){
char* line1 = new char[1000]; char* line2 = new char[1000];
strcpy(line1, *((const char**) a));
strcpy(line2, *((const char**) b));
char* left = &(strtok(line1, " \t"))[column-1];
char* right = &(strtok(line2, " \t"))[column-1];
return strcmp(left, right);
}
1000 - это потому, что я просто обобщил (и специально сделал плохое кодирование), чтобы переобобщить, что ни одна строка не будет длиннее 1000 символов.
Что меня смущает, так это то, что когда я использую отладчик в Eclipse, я вижу, что он сравнивает его успешно в первый раз, а затем во втором раунде возникает ошибка сегментации при попытке их сравнения.
Я также пытался изменить код для назначения левого и правого на то, что ниже, но это тоже не помогло
char* left = new char[100];
strcpy(left, &(strtok(line1, " \t"))[column-1]);
char* right = new char[100];
strcpy(right, &(strtok(line2, " \t"))[column-1]);
Пожалуйста, помогите мне понять, что является причиной ошибки сегментации. В первый раз он сравнивает два, слева = "Уильямсон" и справа = "Томпсон". Во второй раз он сравнивает (и пытается вылететь) left = "Cartwright" и right = "Thompson"