Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [C++] Удаление повторяющихся слов из строки, Слова разделены пробелами и запятыми 
V
    Опции темы
stella_betelgeize
Дата 11.12.2007, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 30.11.2007

Репутация: нет
Всего: нет



Такая вот задача:

Ввести строку, слова в которой разделены пробелами и запятыми. Распечатать эту строку, удалив из нее те слова, которые встретились в ней более одного раза.


Не получается функция, удаляющая повторяющиеся слова. :(  

Вот творческие муки: 

Код

char* del(char *str)
{
    int i, n=strlen(str);
    char *S=new char [80]; 
    int W, k;
    int h=0;
    int a=0, b;
    for (i=a; i<n; i++)
        {
            while (str[i]!=' ') i++;
            b=i;
            k=b-a;
            for (h=0; h<k; h++)
                {
                    S[h]=str[h+a];
        
                }
                    S[h]='\0';    
                    W=strcspn (S, str);    
                    if(W==-1)
                    a=i+1;
                    else
                    {
                        for (i=W; i<W+k; i++)
                        str[i]=str[i+k];
                    }
        
        }
        return str;            
}


Пыталась применить функцию strcspn()...

Подскажите пожалуйста, как можно решить эту задачу. 


PM MAIL   Вверх
t_gran
Дата 12.12.2007, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 13.11.2007
Где: г.Усть-Илимск

Репутация: 33
Всего: 37



Путем не тестил. Небыло времени. Что в голову пришло первым.

Код

char *del (char *inStr)
{
   char *newStr= new char [strlen (inStr) + 1];
   char *buff= new char [strlen (inStr) + 1];
   *newStr= '\0';
   int i= 0;
   while (true)
   {
      if (*inStr == ',' || *inStr == ' ' || *inStr == '\0')
      {
         buff[i]= '\0';
         if (strstr (newStr, buff) == NULL)
            strcat (newStr, buff);
         i= 0;
      }
      if (*inStr == '\0')
            break;
      buff[i++]= *inStr++;
   };
   delete buff;
   return newStr;
}



--------------------
Я знаю, что ничего не знаю© Сократ
user posted image
PM MAIL WWW   Вверх
Dov
Дата 12.12.2007, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


аСинизатор
***


Профиль
Группа: Завсегдатай
Сообщений: 1721
Регистрация: 10.5.2003
Где: Эрец-Исраэль

Репутация: 50
Всего: 88



Цитата(t_gran @  12.12.2007,  11:59 Найти цитируемый пост)
Путем не тестил. Небыло времени...

Это плохо.  smile 

t_gran, получается такая картина. Как видно из кода 
Код

buff[i++]= *inStr++;
 ,  в buff попадает не только то, что находится между разделителями, но и сам разделитель, находящийся перед 'словом'. Ферштеин?  smile Т.е. если у тебя есть строка вида:
Код
str = " qwerty asd qwerty";
, то всё будет ОК. А если такая 
Код
str = " qwerty asd,qwerty";
 или даже такая 
Код
str = "qwerty asd qwerty";
, то ...    smile 


--------------------
Тут вечности запах томительный,
И свежие фрукты дешевые, 
А климат у нас – изумительный, 
И только соседи – #уевые. 
                           Игорь Губерман.
PM   Вверх
t_gran
Дата 14.12.2007, 07:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 13.11.2007
Где: г.Усть-Илимск

Репутация: 33
Всего: 37



Dov, ты абсолютно прав. stella_betelgeize, извиняй за дизинформацию. Будет время обязательно исправлю.


--------------------
Я знаю, что ничего не знаю© Сократ
user posted image
PM MAIL WWW   Вверх
t_gran
Дата 17.12.2007, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 621
Регистрация: 13.11.2007
Где: г.Усть-Илимск

Репутация: 33
Всего: 37



Код

char *del (char *inStr)
{
   char *newStr= new char [strlen (inStr) + 1]; // Итоговая (результирующая) строка
   char *bufStr= new char [strlen (inStr) + 1]; // Буфер обмена (хранение текущего слова)
   *newStr= '\0'; // "Обнуляем" результирующую строку newStr
   int i= 0;      // Индекс текщей позиции в буфере
   while (true)
   {
      if (*inStr == ' ' || *inStr == ',' || *inStr == '\0')
      {
         bufStr[i]= '\0'; // "Замыкаем" буфер обмена
         if (strstr (newStr, bufStr) == NULL) // Ищем в результирующей строке слово расположенное в буфере
         {
            strcat (newStr, bufStr); // Добовляем в конец результирующей строки слово из буфера
         }
         while (*inStr == ' ' || *inStr == ',') // Пропускаем все пробелы и запятые
         {
            int len= strlen (newStr);
            newStr[len]= *inStr++; // Тупо добавляем эти символы в результирующую строку
            newStr[len + 1]= '\0'; // "Замыкаем"
         }
         i= 0; // Заново забиваем буфер
      }
      if (*inStr == '\0') // Ну, это для выхода
      {
         break;
      }
      bufStr[i++]= *inStr++; // Копируем текущей символ с входной строки в буфер
   }
   delete bufStr;
   return newStr;
}



--------------------
Я знаю, что ничего не знаю© Сократ
user posted image
PM MAIL WWW   Вверх
stella_betelgeize
Дата 17.12.2007, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 8
Регистрация: 30.11.2007

Репутация: нет
Всего: нет



Огромное спасибо! =)  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0467 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.