• Познакомьтесь с пентестом веб-приложений на практике в нашем новом бесплатном курсе

    «Анализ защищенности веб-приложений»

    🔥 Записаться бесплатно!

  • CTF с учебными материалами Codeby Games

    Обучение кибербезопасности в игровой форме. Более 200 заданий по Active Directory, OSINT, PWN, Веб, Стеганографии, Реверс-инжинирингу, Форензике и Криптографии. Школа CTF с бесплатными курсами по всем категориям.

Сортировка по алфавиту

  • Автор темы BattleMage
  • Дата начала
B

BattleMage

Всем привет! У меня такой вопрос: как отсортировать слова по алфавиту? Например, есть 6 слов: "мама", "человек", "мир", "папа", "арбуз", "баня". Должно получиться так: "арбуз", "баня", "мама", "мир", "папа", "человек" :)
Как я понимаю нужно сравнивать коды символов. Например, код буквы "а" меньше, чем код буквы "б". Кстати, сравнением только первых букв не обойтись ;)

Подскажите как это реализовать на языке Си?
 
E

European

<!--QuoteBegin-BattleMage+18:09:2007, 14:17 -->
<span class="vbquote">(BattleMage @ 18:09:2007, 14:17 )</span><!--QuoteEBegin-->Подскажите как это реализовать на языке Си?
[snapback]78649" rel="nofollow" target="_blank[/snapback]​
[/quote]
Для сравнения можно использовать strcmp.
Небольшой пример есть тут: https://codeby.net/threads/8605
 
C

crank...

если я не ошибаюсь можно получить аски коды символов, вот их и сравнивай помоему они идут по возростанию начиная от а, насколько я знаю в книге дейтела даже приведена таблица с аски и самими символами
 
E

European

Для: crank...
Сразу анекдот вспомнился про удаление русским гланд через сами знаете что
 
S

shisik

<!--QuoteBegin-crank...+18:09:2007, 16:52 -->
<span class="vbquote">(crank... @ 18:09:2007, 16:52 )</span><!--QuoteEBegin-->помоему они идут по возростанию начиная от а
[snapback]78680" rel="nofollow" target="_blank[/snapback]​
[/quote]
Сначала идут латинские 'A'..'Z', потом 'a'..'z'. После этого уже 'А'..'Я' и в самом конце 'а'..'я'. Из последовательности выпадают буквы ё и Ё. Кроме того, между группами есть промежутки других символов, а коды кириллицы также зависят от кодировки.
 
E

European

Да причем тут коды символов? Строки нужно сравнивать!
 
F

Folderx

BattleMage, если надо будет аски коды определить сделай цикл типа

перебираешь все коды от 0 до 255

Код:
int i;
for (i = 0; i <= 255; i++)
printf("%c", i);

он тебе распечатывает все номера в виде символов, то же самое обратно работает символ в цифру

вот бы ещё с юнионами разобраться можно через юнион ещё

Код:
union symbols { int a; char b; } symbols;
symbols.a = 46;
printf("%c", symbols.b);
выведет символ точку

А можно через память выводить как Шизик делает :huh:
 
P

Pasha

Для: Folderx
про юнион - это шутка была?

По теме: stricmp спасет отца русской демократии.
 
B

BattleMage

Вообще, European и Pasha правы: нужно сравнивать строки, а не коды символов. Спасибо, получилось ;)
 

Kmet

Well-known member
25.05.2006
904
8
BIT
0
вообщето то надо сравнивать с учетом локали..........
 
F

Folderx

Для: Folderx
про юнион - это шутка была?
У меня работает через юнион, только если не массив а просто переменная. С массивами там глюк видимо из-за разного количества памяти на каждый тип.

А strcmp всё равно на символы всё будет раскладывать.
 
E

European

<!--QuoteBegin-Folderx+19:09:2007, 10:36 -->
<span class="vbquote">(Folderx @ 19:09:2007, 10:36 )</span><!--QuoteEBegin-->А strcmp всё равно на символы всё будет раскладывать.
[snapback]78776" rel="nofollow" target="_blank[/snapback]​
[/quote]
Зачем переписывать уже написанный и миллион раз использованный проверенный код?
 
P

Pasha

Для: Kmet
Вообще-то stricmp стравнивает с учетом локали.
Для: Folderx
а memcpy все равно по одному байту копирует, printf по одному символу выводит...
 
E

European

Для: Pasha
А потом все к машинным командам сводится :)
 

Kmet

Well-known member
25.05.2006
904
8
BIT
0
Для: Pasha
ну вообщето не полностью, если не изменяет память с этой функцией есть пару нюансов, типа того что она учитывет только LC_CTYPE. Рекомендуемое решение это strcoll или stricoll
 
G

garrymax

Без изобретения колеса - все из стандартных библиотек:
Код:
#include <stdlib.h>
void qsort (void *sort_array, size_t array_count, size_t word_size, int (*compar) (const void *,const void *));
Аргументы:
sort_array - сам массив
array_count - количество элементов в массиве
word_size - длинна в байтах самого длинного слова или скока нуна символов для сравнения, например до 3-х, а остальные не в счет
compar - адрес функции сравнения, можно указать стандартную strcmp или strcoll или вот так:
Код:
/*это в качестве функции сравнения - compar*/
int intcompare_elements (char **p1, char **p2) {
return strcoll (*p1,*p2);
}
Эта функция должна выдавать меньше нуля, если элемент p1 меньше p2; ноль, если равны; больше нуля, если элемент 1p больше 2p. В нее можно вставить toupper или tolower на первый символ, если нужно равенство заглавных и прописных (макрос в #include <ctype.h>).
 
F

Folderx

Зачем переписывать уже написанный и миллион раз использованный проверенный код?
Да они не идеальные эти функции которые по дефолту там есть в си.
У меня была надежда на них, пока я не столкнулся с тем, что scanf срывалась в штопор, когда она стояла в цикле, я так и не разобрался пришлось всё делать вручную(разветвление внутри цикла чтобы сканф не брал два символа подряд, а брал один и потом выключался), вот и эти функции, во-первых надо включать заголовок стринг.х, во вторых они работают как-то непонятно, лучше свою понятную накатать, особенно непонятно работают переменные то у них адрес передаётся, то не адрес а значение, там не поймёшь.
 
E

European

<!--QuoteBegin-Folderx+21:09:2007, 11:57 -->
<span class="vbquote">(Folderx @ 21:09:2007, 11:57 )</span><!--QuoteEBegin-->Да они не идеальные эти функции которые по дефолту там есть в си.
[snapback]79074" rel="nofollow" target="_blank[/snapback]​
[/quote]
Твои, конечно же, идеальны, эффективны и понятны
<!--QuoteBegin-Folderx+21:09:2007, 11:57 -->
<span class="vbquote">(Folderx @ 21:09:2007, 11:57 )</span><!--QuoteEBegin-->У меня была надежда на них, пока я не столкнулся с тем, что scanf срывалась в штопор, когда она стояла в цикле, я так и не разобрался пришлось всё делать вручную
[snapback]79074" rel="nofollow" target="_blank[/snapback]​
[/quote]
Если не разобрался, то почему думаешь что проблема в scanf, а не в твоем коде?<!--QuoteBegin-Folderx+21:09:2007, 11:57 -->
<span class="vbquote">(Folderx @ 21:09:2007, 11:57 )</span><!--QuoteEBegin-->во-первых надо включать заголовок стринг.х,
[snapback]79074" rel="nofollow" target="_blank[/snapback]​
[/quote]
Очень серьезный недостаток
<!--QuoteBegin-Folderx+21:09:2007, 11:57 -->
<span class="vbquote">(Folderx @ 21:09:2007, 11:57 )</span><!--QuoteEBegin-->то у них адрес передаётся, то не адрес а значение, там не поймёшь.
[snapback]79074" rel="nofollow" target="_blank[/snapback]​
[/quote]
В функции обработки строк, строки передаются по значению? Ну-ну..
 
F

Folderx

Так это ж набор, когда его написали там, что тогда было модно, это надо открывать функцию и читать её, проще свою написать конечно(плюс ещё функций для строк может не доставать и всё равно придётся свою писать), ещё мне не нравятся ограничения(может я хочу чтобы он strcmp с обратной стороны делал, а такого параметра нет, а когда у меня есть своя функция, я могу её дописать наскоряк чтобы у неё был такой параметр, удобнее)

По сканфу, не, конкретный такой слёт в штопор, я потом по интернету лазил, нашёл подобные ошибки, тоже функция слетает просто и программа зависает(я по своей программе понял что там толи очистки буфера(которым сканф пользуется) нету, толи чо-то вот наподобие, потому что там был цикл и функция вроде должна одну строку взять, а она на втором шаге цикла продолжала брать первую строку(нормально да?), почему так, один оператор - одна строка(я так думаю так должно быть), мы же когда getchar() пишем, он же не берёт предыдущие символы которые мы с клавы вводили.

Я чо про юнионы написал, странная штука символы он складывает в массив, а целые затирает, не понимаю вроде размеры проверил у символа размер 1, у целого размер 4, может из-за этого).
 
P

Pasha

<!--QuoteBegin-Folderx+22:09:2007, 00:49 -->
<span class="vbquote">(Folderx @ 22:09:2007, 00:49 )</span><!--QuoteEBegin-->Так это ж набор, когда его написали там, что тогда было модно, это надо открывать функцию и читать её, проще свою написать конечно
[snapback]79172" rel="nofollow" target="_blank[/snapback]​
[/quote]Да обычный велосипед это древняя конструкция, тогда так было модно. Проще придумать свое 2-х колесное транспортное средство, чем научится на нем ездить.<!--QuoteBegin-Folderx+22:09:2007, 00:49 -->
<span class="vbquote">(Folderx @ 22:09:2007, 00:49 )</span><!--QuoteEBegin-->По сканфу ...snip...
[snapback]79172" rel="nofollow" target="_blank[/snapback]​
[/quote]Приведи конкретный глючный пример, а не "когда-то у меня что-то не работало".
<!--QuoteBegin-Folderx+22:09:2007, 00:49 -->
<span class="vbquote">(Folderx @ 22:09:2007, 00:49 )</span><!--QuoteEBegin-->Я чо про юнионы написал, странная штука символы он складывает в массив, а целые затирает, не понимаю вроде размеры проверил у символа размер 1, у целого размер 4, может из-за этого).
[snapback]79172" rel="nofollow" target="_blank[/snapback]​
[/quote]Изменение string1[0] должно затирать digit1[0], и, судя по соседнему топику, затирает. Что не так?
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!