Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++] Удаление повторяющихся слов из строки


Автор: stella_betelgeize 11.12.2007, 16:18
Такая вот задача:

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


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

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

Код

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()...

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


Автор: t_gran 12.12.2007, 12:59
Путем не тестил. Небыло времени. Что в голову пришло первым.

Код

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;
}

Автор: Dov 12.12.2007, 17:41
Цитата(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 

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

Автор: t_gran 17.12.2007, 08:53
Код

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;
}

Автор: stella_betelgeize 17.12.2007, 16:41
Огромное спасибо! =)  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)