Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
#1

qsort - C++

27.06.2011, 22:49. Просмотров 997. Ответов 7
Метки нет (Все метки)

Вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <cstdio>
#include <algorithm>
 
int compare(const void *s1, const void *s2)
{
    return strcmp((char *)s1, (char *)s2) < 0;
}
 
#define N 4
 
int main()
{
    const char *words[N] = {"needle", "ascii", "cpp", "ass"};
 
    qsort(words, N, sizeof(char *), compare);
    //std::sort(words, words+4, compare);
 
    for (size_t i = 0; i < N; ++i) {
        printf("%s\n", words[i]);
    }
 
    return 0;
}
На Visual Studio 2008 вывод
такой,
needle
ascii
cpp
ass
то есть последовательность не изменяется, а на g++ переставляется в обратном
порядке.
ass
cpp
ascii
needle
Если qsort закомментировать, а std::sort наоборот раскомментировать, то вывод получается
ожидаемым.
ascii
ass
cpp
needle
Что не так с qsort? Почему она не работает ожидаемым образом?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.06.2011, 22:49     qsort
Посмотрите здесь:

qsort - C++
Ребят,расскажи подробно и простенько про qsort;Видел тему,но ничего не понял.Я новичек еще можно сказать пока в С++. у меня просто...

qsort - C++
Вот код программы. Посмотрите вопрос в комментарии. #include &lt;iostream&gt; #include &lt;stdlib.h&gt; using namespace std; int main() ...

qsort C++ - C++
Помогите, плиз,разобраться с этой функцией, я прогу написала, но мало чего понимаю в ней, я написала в трех файлах, так и выкладываю. ...

qsort - C++
читал, что с помощю QSORT можно упорядочить масив, но не пишет как. помогите!!

Функция Qsort - C++
Прошу ознакомить меня с функцией Qsort. Если можно, то не мудрено и на примерах. Спасибо.

Vector and qsort - C++
Здравствуйте, есть код: #include &quot;iostream&quot; #include &quot;vector&quot; using namespace std; int compare (const void * a, const void *...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт С++
6553 / 3973 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
27.06.2011, 22:53     qsort #2
а если так?
C++
1
2
3
4
int compare(const void *s1, const void *s2)
{
        return strcmp((char *)s1, (char *)s2);
}
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
27.06.2011, 22:58  [ТС]     qsort #3
Цитата Сообщение от Maxwe11 Посмотреть сообщение
а если так?
C++
1
2
3
4
int compare(const void *s1, const void *s2)
{
        return strcmp((char *)s1, (char *)s2);
}
Получается все наоборот, студия последовательность переставляет в обратном порядке, а g++ не изменяет. Но сортировка так и не работает.
grizlik78
Эксперт С++
1908 / 1440 / 110
Регистрация: 29.05.2011
Сообщений: 2,995
27.06.2011, 22:58     qsort #4
Правильный вид этой функции для qsort такой:
C
1
2
3
4
int compare(const void *s1, const void *s2)
{
        return strcmp(*(char * const *)s1, *(char * const *)s2);
}
указатели передаются по указателю, так что надо разыменовывать. Ну и возвращать результат самой strcmp
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
27.06.2011, 23:03  [ТС]     qsort #5
Цитата Сообщение от grizlik78 Посмотреть сообщение
Правильный вид этой функции для qsort такой:
C
1
2
3
4
int compare(const void *s1, const void *s2)
{
        return strcmp(*(char * const *)s1, *(char * const *)s2);
}
указатели передаются по указателю, так что надо разыменовывать. Ну и возвращать результат самой strcmp
Работает
s1 и s2 приводятся к типу "указатель на константный указатель на char" а потом разыменовыаются и мы получаем "константный указатель на char" то есть строку, так?
grizlik78
Эксперт С++
1908 / 1440 / 110
Регистрация: 29.05.2011
Сообщений: 2,995
27.06.2011, 23:06     qsort #6
Ну, qsort должна уметь работать с любыми данными, поэтому они передаются через указатели на void. Но поскольку там реально указатели на char*, то сначала преобразовываем к char**, а потом разыменовываем.
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
27.06.2011, 23:19  [ТС]     qsort #7
Тогда можно сделать так:
C
1
2
3
4
int compare(const void *s1, const void *s2)
{
        return strcmp(*(const char * const *)s1, *(const char * const *)s2);
}
Ведь это функция сравнения, и она не должена изменять свои параметры.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.06.2011, 23:21     qsort
Еще ссылки по теме:

Сортировка qsort - C++
Доброго времени суток, уже применял qsort для сортировки цифр, но не могу найти его для алфавита. Необходимо распределить предложения в...

не работает qsort - C++
#include &lt;iostream&gt; #include &lt;math.h&gt; #include &lt;iomanip&gt; #include &lt;string.h&gt; using namespace std; struct MARSH { char...

qsort vs sort - C++
Собственно вопрос что лутше, в каких ситуациях, и почему , спасибо

Функция qsort - C++
Здравствуйте! Помогите пожалуйста отсортировать студентов с помощью функции qsort по &quot;age&quot; или другим критериям. Спасибо! #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
grizlik78
Эксперт С++
1908 / 1440 / 110
Регистрация: 29.05.2011
Сообщений: 2,995
27.06.2011, 23:21     qsort #8
Да, можно. Но я не стал менять форму, которая приведена у меня в мане
Yandex
Объявления
27.06.2011, 23:21     qsort
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru