Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.01.2008, 18:45   #1
sasha45
Пользователь
 
Регистрация: 29.01.2008
Сообщений: 19
По умолчанию Упорядочить слова в алфавитном порядке

Здравствуйте. Помогите пожалуйста найти ошибку. Нужна помощь в написании функции, которая упорядочивает слова в строке (строка вводится пользователем) в алфавитном порядке. В функцию передается строка, и в этой функции надо её обработать. У меня алгоритм такой: создать двумерный массив, и в этот двумерный массив вписывать слова строки так, чтобы в одной строке массива было одно слово строки. Т.е:
до:
кафедра вычислительной техники
после:
кафедра
вычислительной
техники

У меня возникла проблема с разделением строки на слова, и с записью эти слов в массив. Вот примерный код разделения строки:

Код:
char *obrabotka(char *text)             // В функцию передается указатель      
                                                   // на исходную строку
  {
    char **slova=NULL;                  // Указатель на двумерный массив, в 
                                                 // котором 1 строка  - это 1 слово
                                                 // строки
    // Указатель на символ
    char *a=NULL;
    int i,j,n=0,m=0,k;
    // Указатель на переменную для обмена значений
    char *z=NULL;

    // Передаем строку
    a=text;
    // Пока не конец строки
    while(a!='\0')
      {  
        // Пока символ - разделитель
        while(checkChar(a)==0)
          {
            // Пропускаем его
            i++;
            a+=1;
            // Если конец строки - прервать цикл
            if(a=='\0')
              break;
          }
        if(a=='\0')
          break;
        // Выделение памяти под строки массива
        slova=(char**)realloc(slova,(n+1)*sizeof(char*));
        for(j=0;checkChar(a)!=0;j++)
          {
            // Выделение памяти под элементы строки массива
            slova[n]=(char*)realloc(slova[n],(m+1)*sizeof(char));
            // Запись слов в строки массива
            *(slova[n]+j)=*(a+i);
            m++;
            // Переход к след. символу
            a+=1;
          }
        n++;
      }
С сортировкой я разберусь, а вот с разделением строки на слова что-то никак не могу(( Помогите пожалуйста. И если тут плохо написано про выделение памяти для **slova сильно не ругайте пожалуйста, т.к. при выделении памяти для двумерного массива, у меня в голове все путается.
sasha45 вне форума Ответить с цитированием
Старый 29.01.2008, 19:07   #2
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

У Вас не с realloc вот здесь
Код:
slova[n]=(char*)realloc(slova[n],(m+1)*sizeof(char));
проблема? Я не вижу, чтобы Вы массив обнуляли.

**************************

Ещё одна вещь нашлась:
warning C4700: local variable 'i' used without having been initialized
вот здесь
Код:
// Пропускаем его 
i++;
а дальше она используется:
Код:
            *(slova[n]+j)=*(a+i);
А почему Вы строковые функции не используете?

Последний раз редактировалось B_N; 29.01.2008 в 19:18.
B_N вне форума Ответить с цитированием
Старый 29.01.2008, 19:17   #3
sasha45
Пользователь
 
Регистрация: 29.01.2008
Сообщений: 19
По умолчанию

Всмысле? А при инициализации то, что **slova=NULL это не то? Или жолжно быть что-то типа:
Код:
if(slova!=NULL)
  {
    for(i=0;i<n;i++)
      free(slova+i);
    free(slova);
  }
Так?
sasha45 вне форума Ответить с цитированием
Старый 29.01.2008, 19:26   #4
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от sasha45 Посмотреть сообщение
Всмысле? А при инициализации то, что **slova=NULL это не то? Или жолжно быть что-то типа:
Код:
if(slova!=NULL)
  {
    for(i=0;i<n;i++)
      free(slova+i);
    free(slova);
  }
Так?
Ну free Вы там не сделаете, получите access violation, а вот memset'нуть новую часть массива нулями не помешает, а лучше даже вот здесь:
Код:
slova[n]=(char*)realloc(slova[n],(m+1)*sizeof(char));
realloc заменить на malloc.... Попробуйте пока, если не выйдет скомпилирую эту Вашу obrabotku , посмотрим, где глючит.
B_N вне форума Ответить с цитированием
Старый 29.01.2008, 20:05   #5
sasha45
Пользователь
 
Регистрация: 29.01.2008
Сообщений: 19
По умолчанию

заменил. не помогает.
А вот Вы упомянули в предыдущем сообщении строковые функции, можно поподробнее о них?
sasha45 вне форума Ответить с цитированием
Старый 29.01.2008, 20:16   #6
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от sasha45 Посмотреть сообщение
заменил. не помогает.
А вот Вы упомянули в предыдущем сообщении строковые функции, можно поподробнее о них?
Да ну как Вам сказать поподробнее, в С есть куча функций для работы со строками, особенно в новых реализациях. Если хотите, я конечно список оглашу, просто я почти переделал Вашу функцию (там чего-то так у Вас накручено, что проще оказалось по-новой написать Что Вас раньше интересует?

Да, и попутно вопрос, в том чтобы хранить именно слова, а не указатели на них в изначальном тексте и длину, есть какой-то тайный смысл?
B_N вне форума Ответить с цитированием
Старый 29.01.2008, 20:24   #7
sasha45
Пользователь
 
Регистрация: 29.01.2008
Сообщений: 19
По умолчанию

Ой, если честно даже не знаю. Мысль была как раз в хранении слов, а потом в их сортировке.
А слышал что есть некоторые функции по копированию строк, конкатенации, поиск подстроки и что-то так еще.
sasha45 вне форума Ответить с цитированием
Старый 29.01.2008, 20:33   #8
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Ну вот смотрите. У Вас с английским как?
вот такие функции есть в майкрософтовской рантайм-библиотеке (именно "чистый" C, без всяких классов и прочего, там еще полно)
http://msdn2.microsoft.com/en-us/lib...4x(vs.71).aspx

Вот такие гарантировано есть на любой платформе / в любой библиотеке:
http://www.cplusplus.com/reference/clibrary/cstring/

Вам этого материала хватит? Теперь справитесь или как?
B_N вне форума Ответить с цитированием
Старый 29.01.2008, 21:39   #9
sasha45
Пользователь
 
Регистрация: 29.01.2008
Сообщений: 19
По умолчанию

Спасибо за ссылки. Хм... Если честно, то помощь мне понадобится, если Вам не трудно конечно))), потому что я Си изучаю не так давно, и много чего не могу понять иногда.

Нашел на первой сслыке функцию strtok, тока не могу понять как её в данном случае использовать.
sasha45 вне форума Ответить с цитированием
Старый 29.01.2008, 21:57   #10
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

sasha45, если еще с полчасика потерпите, я Вам дам работающий парсер (для сравнения, конечно ) и кучу советов, а strtok - функция мировая, только вчера писал ответ про использование ее в PHP. , полистайте назад, не помню, как топик назывался, но он был в разделе про PHP.
B_N вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
дан текстовый массив из 200 букв. Выстроить в алфавитном порядке все строчные буквы Тина Помощь студентам 6 02.07.2008 22:53
отсортировать таблицу сначала в алфавитном порядке фамилий продавцов, затем в порядке возростания получен Lora Microsoft Office Excel 1 31.05.2008 17:22
Во вводимом тексте переписать все слова в обратном порядке. menlo Помощь студентам 5 17.11.2007 10:18