Ошибка сегментации при попытке упорядочить слова по алфавиту в c ++ - PullRequest
0 голосов
/ 05 октября 2019

Я новичок в c ++, и я пытаюсь написать код, который сортирует в алфавитном порядке некоторые слова, которые я даю из консоли. Я не знаю почему, но я получаю ошибку ошибки сегментации. Не могли бы вы помочь мне?

#include <iostream>
#include <fstream>
#include <stdlib.h>
#include <cstring>

using namespace std;
int arrange (const void * a, const void * b)
{
  //return ( *(int*)a - *(int*)b );
    return (strcmp(*(const char **)a, *(const char **)b));
}

int main() {
    char words[50][50];
    int i=0, n;
    cout << "Enter the number of words to be ordered:";
    cin >> n; 
    int length = 0;
    for (i=0;i<n;i++) {
        cin >> words[i];
        cout << words[i];
    }

    qsort(words, n, sizeof(words[0]), &arrange);
}

Вот так выглядит мой код

Ответы [ 2 ]

2 голосов
/ 05 октября 2019

Это больше вопрос о Си. Процедура qsort передает два значения: не указатели на значения;следовательно, ваше сравнение должно быть

int arrange (const void * a, const void * b)
{
    return (strcmp((const char *)a, (const char *)b));
}
1 голос
/ 05 октября 2019

Ваш код более C-подобен C ++. Вы должны использовать vector, string и sort. И проверьте ваш ввод на наличие сбоев.

Кроме того, ваш код должен быть скомпилирован как cut-n-paste. Вам не хватает заголовков и using операторов.

Использование qsort (подпрограмма C) не будет работать так, как вы ее используете. C ++ предоставляет sort, что гораздо больше подходит для решаемой вами проблемы.

Например ...

#include <algorithm>
#include <iostream>
#include <iterator>
#include <stdexcept>
#include <string>
#include <vector>

using std::begin;
using std::cin;
using std::cout;
using std::end;
using std::ostream;
using std::sort;
using std::runtime_error;
using std::string;
using std::vector;

static ostream& operator<<(ostream& o, vector<string> const& words) {
    char const* sep = "";

    for(auto const& word : words) {
        o << sep << word;
        sep = ", ";
    }

    return o;
}

int main() {
    vector<string> words;
    cout << "Dati nr de cuvinte de ordonat:";
    int n;
    if (!(cin >> n)) throw runtime_error("bad input");

    for (int i = 0; i < n; ++i) {
        string word;
        if (!(cin >> word)) throw runtime_error("bad input");
        words.push_back(word);
    }

    cout << "Before sorting: " << words << "\n";
    sort(begin(words), end(words));
    cout << "After sorting: " << words << "\n";
}
...