Последний раз редактировалось Joker_vD 09.01.2013, 16:15, всего редактировалось 1 раз.
Не используйте gets(char*). Ее в 2011 году наконец-то убрали из стандарта языка Си и добавили gets_s(char*, size_t). Кроме того, есть fgets(). У GNU (а значит, в BSD/Linux) есть замечательная функция getline() — увы, она нестандартна, под Windows вы ее вряд ли встретите. Так что можете перевоплотить ее сами: читаете в буфер, если он закончился — удлиняете и читаете дальше.
Индексная сортировка — заводите массив int *indices = (int*)malloc(sizeof(int) * starting_size) под индексы, где начинаются слова. Пробегаете по строке, заполняя этот массив и заменяя первый пробел в конце слова на '\0'. Да, скорее всего, indices тоже ручками придется удлинять. Теперь сортируете этот массив так, чтобы у вас было strcoll(&s[indices[i]], &s[indices[i+1]]) <= 0 для всех i, для которых это имеет смысл, после чего for(int i = 0; i < indices_count; i++) { printf("%s\n", &s[indices[i]]); }
Когда используете printf(), всегда, всегда печатайте строки с использованием "%s": даже простейшие printf("%s", "Error!"); — потому что иначе, при использовании printf(s), рано или поздно внутри s окажется процент — и вы испортите стек. Это очень больно.
Насчет setlocale: если вы пишете консольное приложение под Windows, стоит сказать setlocale(LC_ALL, ".OCP"), после чего strcoll(char*, char*) будет сравнивать строки именно в OEM-кодировке, и вам не нужно будет дергать OemToAnsi()/AnsiToOem() . Под FreeBSD/Linux, насколько я помню, работает setlocale(LC_ALL, NULL) — там нету шизофрении с OEM/ANSI кодировками. Кстати, вам на самом деле здесь LC_ALL не особо нужен, хватит и LC_COLLATE.
|