Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
Dipso
0 / 0 / 0
Регистрация: 04.11.2009
Сообщений: 25
#1

Строки : проверка на вхождение слова - C++

26.11.2009, 12:58. Просмотров 1526. Ответов 3
Метки нет (Все метки)

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

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include "stdafx.h"
#include <stdio.h>
#include <string.h>
 
void DeleteSymbols(char* str)
{
        int i;
        for(i=0;str[i+1]!=0;i++)
        {
                str[i]=str[i+1];
        }
        str[i]=0;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
        char strIn[255],strOut[255],strBuf[255],strBuf2[255];
        for(;;)
        {
                strOut[0]=0;
                printf("Vvedite stroku\n");
                gets(strIn);
         strcpy(strBuf2,strIn);     // <<<---
                if(strIn[0] == '0' && strIn[1] == 0) break;
                while(strIn[0]!=0)
                {
                        strBuf[0]=0;
                        for(;strIn[0]==' ' || strIn[0]=='\t'; DeleteSymbols(strIn));
                        strncpy( strBuf,strIn,strcspn(strIn," \t"));
                        strBuf[strcspn(strIn," \t")] = 0;
                        for(;!strspn(strIn," \t") && strIn[0]!=0;)
                                DeleteSymbols(strIn);
                                for (;strBuf2[0]==' ';DeleteSymbols(strBuf));  //  <<<----
              while(strBuf2[0]!=0)                              
                 {
                                          if (strstr(strBuf2,strBuf)==0)
                {
                                           strcat(strOut," ");
                                                  strcat(strOut,strBuf);
                 }
                        }                                                    //<<<---                                        
                       
                }
                printf("StrOut = %s\n",strOut);
        }
        return 0;
}
В цикле обозначенном стрелками прошу проверить на правильность написания. Хотел реализовать цикл на проверку вхождения этого слова. Вот на примере :
исходную строку копирую в strBuf2. вот например сама строка :
aa bbb cc bbb d
потом я в strBuf записываю первое слово : аа и удаляю его и исходной строки
и в цикле проверяю на вхождение из оставшейся строки :
bbb cc bbb d
если это слово не встретилось, то записываю его в результат

Вот как раз и возникла проблема с циклом, т.к. при запуске просто повисает (вроде бесконечный цикл или как то так)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.11.2009, 12:58     Строки : проверка на вхождение слова
Посмотрите здесь:

C++ Удалить из строки каждое вхождение подстроки
Найти в тексте первое вхождение заданного слова (С++) C++
C++ Посчитать вхождение каждого слова в строку
массив/вхождение заданной строки( программа на си) C++
C++ Сформировать файл h, заменив каждое вхождение слова «это» на слово «то»
C++ Найти первое вхождение в строку заданного ключевого слова
Определить вхождение слова в строку C++
Даны три строки: S1, S2, S3. Заменить в строке S1 первое вхождение строки S2 на S3 C++
C++ Некорректная проверка числа на вхождение в диапазон
Найти первое вхождение слова в текст C++
C++ Найдите и замените вхождение некоторого слова на заданное пользователем слово
C++ первое вхождение строки

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
denbessonov
3 / 3 / 0
Регистрация: 14.12.2008
Сообщений: 14
26.11.2009, 14:01     Строки : проверка на вхождение слова #2
Цитата Сообщение от Dipso Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
              while(strBuf2[0]!=0)                              
                 {
                                          if (strstr(strBuf2,strBuf)==0)
                {
                                           strcat(strOut," ");
                                                  strcat(strOut,strBuf);
                 }
                        }                                                    //<<<---                                        
}
Я особо не разбирался с логикой, но если Вы не меняете strBuf2[0], цикл никогда и не кончится.
Dipso
0 / 0 / 0
Регистрация: 04.11.2009
Сообщений: 25
26.11.2009, 15:21  [ТС]     Строки : проверка на вхождение слова #3
Добавил в начало цикл на сам Buf2, и вот действительно загвозкак как сокращать сам Buf2, думаю его надо в цикле for сделать, терь думаю как запихнуть туда )
А за счет того что добавил в начало while терь проходит цикл, но в результат ничего не записывает.

C++
1
2
3
4
5
6
7
8
9
10
while(strBuf2[0]!=0)
   for (;strBuf2[0]==' ';DeleteSymbols(strBuf))  //<<<----
      while(strBuf2[0]!=0)
      {
            if (strstr(strBuf2,strBuf)==1)
               {
             strcat(strOut," ");
                    strcat(strOut,strBuf);
        }
       }
denbessonov
3 / 3 / 0
Регистрация: 14.12.2008
Сообщений: 14
26.11.2009, 20:07     Строки : проверка на вхождение слова #4
Не, так программы не пишут.
Надо сесть и внимательно на листочке продумать, что и как.
Пока это все гадание на кофейной гуще. Проблема осталась та же.
StrBuf2 не изменяется в процессе работы цикла.
Yandex
Объявления
26.11.2009, 20:07     Строки : проверка на вхождение слова
Ответ Создать тему
Опции темы

Текущее время: 01:03. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru