Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
Jack Wade
65 / 38 / 14
Регистрация: 24.02.2013
Сообщений: 250
1

Поиск слов в строке

27.07.2013, 19:25. Просмотров 834. Ответов 7
Метки нет (Все метки)

Помогите пожалуйста, никак не могу сделать нормально программу поиска слов в строке...
В общем - суть проблемы такая:
Когда Я ввожу строку(из 2-х слов, например), с одним знаком пробела(к примеру) - всё нормально, строка ищет слова нормально. Но, когда Я ввожу строку из 2-х пробелом(например), то 1-е слово-нормальное, далее идёт как слово - пробел(так надо для дальнейшей задачи), а след. слово, вместо того, что бы быть пробелом - заносится след. слово, но только так, что 1-й символ там - пробел...
Вот - примерно такой результат работы программы:
Строка - odin dva tri
Результат - (1)odin(2) (3)dva(4) (5)tri
Строка - odin, dva, tri
Результат - (1)odin(2),(3) dva(4), (5) tri
Код программы:
Кликните здесь для просмотра всего текста

C++ (Qt)
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
48
#include <iostream.h>
#include <locale.h>
 
int main(void)
{
    char text[255];
    char slovo[255][255];
    int nslova,nbukva;
    int i=0;
    nslova=0;
    nbukva=0;
    
    setlocale(LC_ALL,"Russian");
    
    cout<<"[ВВЕДИТЕ СТРОКУ]\n";
    gets(text);
    system("cls");
    
    cout<<"[СТРОКА = ("<<text<<") ]\n\n";
    cout<<"[НАЙДЕННЫЕ СЛОВА]\n\n";
    
    while (i!=strlen(text))
      {
          if (text[i]!=' ' || text[i]!=',' || text[i]!='.')
              {
                    slovo[nslova][nbukva]=text[i];
                    nbukva++;
                    i++;
              };
          if (text[i]==' ' || text[i]==',' || text[i]=='.')
              {
                    cout<<slovo[nslova]<<endl;
                    cout<<"Слово = "<<strlen(slovo[nslova])<<" Длинна слова "<<nslova+1<<endl<<endl;
                    nslova++;
                    nbukva=0;
                    slovo[nslova][0]=text[i];
                    nslova++;
                    i++;
              };
      };
    
    cout<<slovo[nslova]<<endl;
    cout<<"Слово = "<<strlen(slovo[nslova])<<" Длинна слова "<<nslova+1<<endl<<endl;
    
    system("pause");
    
    return 0;
}

Скрины:
Кликните здесь для просмотра всего текста






Добавлено через 34 минуты
Спасибо! В помощи уже не нуждаюсь!
Нашёл решение, и решение следующее:
Кликните здесь для просмотра всего текста

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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <iostream.h>
#include <locale.h>
 
int main(void)
{
    char text[255];
    char slovo[255][255];
    int nslova,nbukva;
    int i;
    /*
    char nslovo[255];
    int nomeraslov[255];
    int nnslov;
    int pdepros;
    
    nnslov=0;
    pdepros=0;
    */
    nslova=0;
    nbukva=0;
    i=0;
    
    setlocale(LC_ALL,"Russian");
    
    cout<<"[Введите строку]\n";
    gets(text);
    system("cls");
    
    cout<<"[Строка = ("<<text<<") ]\n\n";
    cout<<"[Найденные слова]\n\n";
    
    while (i!=strlen(text))
      {
          if (text[i]!=' ' || text[i]!=',' || text[i]!='.')
              {
                    slovo[nslova][nbukva]=text[i];
                    nbukva++;
                    i++;
              };
          if (text[i]==' ' || text[i]==',' || text[i]=='.')
              {
                    cout<<slovo[nslova]<<endl;
                    cout<<"Слово = "<<strlen(slovo[nslova])<<" Номер слова "<<nslova+1<<endl<<endl;
                    nslova++;
                    nbukva=0;
                    slovo[nslova][0]=text[i];
                    //nslova++;
                    i++;
              };
          if ((text[i-1]==' ' || text[i-1]==',' || text[i-1]=='.') && (text[i]!=' ' || text[i]!=',' || text[i]!='.'))
            {
                    nslova++;
                    nbukva=0;
                    slovo[nslova][0]=text[i];
                    nslova++;
                    i++;
            };
      };
    
    cout<<slovo[nslova]<<endl;
    cout<<"Слово = "<<strlen(slovo[nslova])<<" Номер слова "<<nslova+1<<endl<<endl;
    
    system("pause");
    
    return 0;
}


Добавлено через 13 минут
Всё таки, решение не правильное...
При поиске в строке odin, dva, tri-работает, но при поиске в odin dva tri - 1-го символа в 2-м и 3-м слове - нету...
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.07.2013, 19:25
Ответы с готовыми решениями:

Поиск количества слов в строке
Доброго времени суток. Нужна помощь. Сделал программу сервер для поиска...

Поиск симметричных слов в строке
Задание: ввести с клавиатуры массив из 30 слов. Создать свои пользовательские...

Строка: Поиск количества слов в строке, которые оканчиваются и начинаются с одной и той же буквы
Пожалуйста, помогите с задачей поиска количества слов в строке, которые...

Как отсортировать строки по кол-ву слов и слова в строке по длине слов
Суть задания:Вводить последовательность не более чем 256 символов,ввод...

В первой строке выписать все первые буквы всех слов, во второй строке — вторых букв
Помогите решить задачу. С клавиатуры вводятся слова через пробел (любой длины и...

7
Novi4ekC
81 / 81 / 33
Регистрация: 03.03.2013
Сообщений: 311
27.07.2013, 20:15 2
Цитата Сообщение от Jack Wade Посмотреть сообщение
Всё таки, решение не правильное...
При поиске в строке odin, dva, tri-работает, но при поиске в odin dva tri - 1-го символа в 2-м и 3-м слове - нету...
Вы в этом условии съели первый символ 2-го и 3-го слова:
C
1
2
3
4
5
6
7
8
          if ((text[i-1]==' ' || text[i-1]==',' || text[i-1]=='.') && (text[i]!=' ' || text[i]!=',' || text[i]!='.'))
            {
                    nslova++;
                    nbukva=0;
                    slovo[nslova][0]=text[i];
                    nslova++;
                    i++;
            };
Добавлено через 3 минуты
Поменяйте условие на:
C
1
2
3
4
5
6
7
8
          if ((text[i-1]==' ' || text[i-1]==',' || text[i-1]=='.') && (text[i]==' ' || text[i]==',' || text[i]=='.'))
            {
                    nslova++;
                    nbukva=0;
                    slovo[nslova][0]=text[i];
                    nslova++;
                    i++;
            };
Добавлено через 3 минуты
Много, конечно, у Вас лишнего, но комментировать не буду, я тоже учусь грамотно и оптимально писать)
0
Jack Wade
65 / 38 / 14
Регистрация: 24.02.2013
Сообщений: 250
27.07.2013, 20:26  [ТС] 3
Теперь - другая проблема...
Я когда ввожу строку "odin, dva, tri.", у меня запоминается лишнее слово, причём его длинна = 0...
Кликните здесь для просмотра всего текста

C++ (Qt)
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include <iostream.h>
#include <locale.h>
 
int main(void)
{
    char text[255];
    char slovo[255][255];
    int nslova,nbukva;
    int i=0;
    nslova=0;
    nbukva=0;
    setlocale(LC_ALL,"Russian");
    
    cout<<"[ПОЛЬЗОВАТЕЛЬСКАЯ СТРОКА]\n";
    gets(text);
    system("cls");
    
    
    
    cout<<"[СТРОКА = ("<<text<<") ]\n\n";
    cout<<"[НАЙДЕННЫЕ СЛОВА(ИСКЛЮЧАЯ ЗНАКИ ПРИПЕНАНИЯ)]\n\n";
    while (i!=strlen(text))
      {
          if (text[i]!=' ' || text[i]!=',' || text[i]!='.')
              {
                    slovo[nslova][nbukva]=text[i];
                    nbukva++;
                    i++;
              };
          if ((text[i-1]!=' ' || text[i-1]!=',' || text[i-1]!='.') && (text[i]==' ' || text[i]==',' || text[i]=='.'))
              {
                    nslova++;
                    nbukva=0;
                    slovo[nslova][0]=text[i];
                    nslova++;
                    i++;
              };
          if ((text[i]==' ' || text[i]==',' || text[i]=='.') && (text[i+1]!=' ' || text[i+1]!=',' || text[i+1]!='.'))
              {
                    slovo[nslova][0]=text[i];
                    nslova++;
                    i++;
                    nbukva=0;
                    slovo[nslova][0]=text[i];
                    nbukva++;
                    i++;
              };
      };
      
      
      
    i=0;
    while (i!=nslova+1)
      {
              {
                    cout<<"Слово № "<<i+1<<" = ";
                    cout.width(6);
                    cout<<slovo[i]<<" Длинна слова = "<<strlen(slovo[i])<<endl;
              };
          i++;
      };
    cout<<endl;
    
    
    
    i=0;
    while(i!=nslova+1)
    {
    if ((strcmp(slovo[i]," ")==0) || (strcmp(slovo[i],",")==0) || (strcmp(slovo[i],".")==0)) i++;
    else
        {
        cout<<i+1<<" ("<<i<<" - реальный номер"<<endl;
        i++;
        };
    };
    system("pause");
 
    return 0;
}


Кликните здесь для просмотра всего текста


0
Novi4ekC
81 / 81 / 33
Регистрация: 03.03.2013
Сообщений: 311
27.07.2013, 20:51 4
Jack Wade, ну Вы же показываете уже другую программу.

Добавлено через 7 минут
Попробуйте в 68-ой строке убрать "+1".
0
Jack Wade
65 / 38 / 14
Регистрация: 24.02.2013
Сообщений: 250
27.07.2013, 20:57  [ТС] 5
Цитата Сообщение от Novi4ekC Посмотреть сообщение
Jack Wade, ну Вы же показываете уже другую программу.

Добавлено через 7 минут
Попробуйте в 68-ой строке убрать "+1".
это та же программа... Просто когда Я копировал сюда из DevC++ русский текст был отображён в ввиде символов, а не текстом, и Я его переписал вручную, но не в точности. А сейчас просто скопировал из блокнота его... Вот и Вся разница(ну да, ещё попробовал переписать процедуру поиска слов... Сократил кое что...

Вот Я её уже так изменил(пытался избавиться от добавления пустого слова)
Кликните здесь для просмотра всего текста

C++ (Qt)
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <iostream.h>
#include <locale.h>
 
int main(void)
{
    char text[255];
    char slovo[255][255];
    int nslova,nbukva;
    int i=0;
    nslova=0;
    nbukva=0;
    setlocale(LC_ALL,"Russian");
 
    cout<<"[ПОЛЬЗОВАТЕЛЬСКАЯ СТРОКА]\n";
    gets(text);
    system("cls");
 
    cout<<"[СТРОКА = ("<<text<<") ]\n\n";
    cout<<"[НАЙДЕННЫЕ СЛОВА(ИСКЛЮЧАЯ ЗНАКИ ПРИПЕНАНИЯ)]\n\n";
    while (i!=strlen(text))
      {
          if (text[i]!=' ' || text[i]!=',' || text[i]!='.')
              {
                    slovo[nslova][nbukva]=text[i];
                    nbukva++;
                    i++;
              };
          if ((text[i]==' ' || text[i]==',' || text[i]=='.') && (text[i+1]!=' ' || text[i+1]!=',' || text[i+1]!='.'))
              {
                   nbukva=0;
                   nslova++;
                   slovo[nslova][nbukva]=text[i];
                   nslova++;
                   i++;
              };
      };
      
    i=0;
    while (i!=nslova+1)
      {
              {
                    cout<<"Слово № "<<i+1<<" = ";
                    cout.width(6);
                    cout<<slovo[i]<<" Длинна слова = "<<strlen(slovo[i])<<endl;
              };
          i++;
      };
    cout<<endl;
 
    i=0;
    while(i!=nslova+1)
    {
    if ((strcmp(slovo[i]," ")==0) || (strcmp(slovo[i],",")==0) || (strcmp(slovo[i],".")==0)) i++;
    else
    if ((strcmp(slovo[i]," ")==0) || (strcmp(slovo[i],",")==0) || (strcmp(slovo[i],".")==0)) i++;
        {
        cout<<i+1<<" ("<<i<<" - реальный номер"<<endl;
        i++;
        };
    };
    system("pause");
 
    return 0;
}


К стати = +1 нужен, т.к. счёт слов ведётся с нуля, т.е. слово под номером 0 - тоже слово...
И счётчик идёт до тех пор, пока не равен кол-ству слов. И когда равно - выход из цикла, следовательно - посл. слово не будет отображено. По этому и написал +1...
0
Nameless One
Эксперт С++
5789 / 3438 / 356
Регистрация: 08.02.2010
Сообщений: 7,448
27.07.2013, 21:05 6
Если я правильно понял, то задача состоит в том, чтобы разбить текст на отдельные слова. Это легко решается с помощью strtok:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
int main(void)
{
    char buf[BUFSIZ];
    const char *delimeters = " ,.?!:()'\"\n\t";
 
    fgets(buf, BUFSIZ, stdin);
 
    for(char *word = strtok(buf, delimeters); word != NULL; word = strtok(NULL, delimeters))
        printf("word `%s' of length %zu\n", word, strlen(word));
 
    exit(0);
}
Кстати, ты разделом ошибся.
0
Jack Wade
65 / 38 / 14
Регистрация: 24.02.2013
Сообщений: 250
27.07.2013, 22:03  [ТС] 7
В общем - по идеи -сделал...(проверял строки "odin dva tri" "odin, dva, tri" "odin, dva, tri." "odin, dva, tri, chetire, pyat.")
Правда - цель конечной программы отличается от цели, которую Я здесь сделать не мог(просто, проблема была именно с поиском слов в строке... А всё остальное - работало нормально(но именно из-за ошибки в поиске слов - и была проблема в дальнейшем написании))...
В любом случае - вот весь код программы(может кому то поможет...)...
Кликните здесь для просмотра всего текста

C++ (Qt)
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#include <iostream.h>
#include <locale.h>
 
int main(void)
{
    char text[255];
    char slovo[255][255];
    char newslovo[255];
    char itog[255];
    int nslova,nbukva;
    int nnslov[255];
    int uknslov=0;
    int i=0;
    int j=0;
    int predpos=0;
    nslova=0;
    nbukva=0;
    setlocale(LC_ALL,"Russian");
 
    cout<<"ЦЕЛЬ ПРОГРАММЫ"<<endl;
    cout<<"Добавить в пред последнее слово между каждой буквой символ '*'."<<endl;
    cout<<"Результат вывести на экран";
    cout<<endl;
    system("pause");
    system("cls");
 
    cout<<"[ПОЛЬЗОВАТЕЛЬСКАЯ СТРОКА]\n";
    gets(text);
    system("cls");
 
    cout<<"[СТРОКА]\n";
    cout<<text<<endl<<endl;
    cout<<"[НАЙДЕННЫЕ СЛОВА(ИСКЛЮЧАЯ ЗНАКИ ПРИПЕНАНИЯ И ЗНАКИ ПУНКТУАЦИИ)]\n";
    while (i!=strlen(text))
      {
          if ((text[i]!=' ' || text[i]!=',' || text[i]!='.') && (text[i+1]!=' ' || text[i+1]!=',' || text[i+1]!='.'))
              {
                    slovo[nslova][nbukva]=text[i];
                    nbukva++;
                    i++;
              };
         if ((text[i]!=' ' || text[i]!=',' || text[i]!='.') && (text[i+1]==' ' || text[i+1]==',' || text[i+1]=='.'))
              {
                    slovo[nslova][nbukva]=text[i];
                    nbukva=0;
                    nslova++;
                    i++;
              };
         if ((text[i]==' ' || text[i]==',' || text[i]=='.') && (text[i+1]==' ' || text[i+1]==',' || text[i+1]=='.'))
              {
                    slovo[nslova][nbukva]=text[i];
                    nslova++;
                    i++;
              };
         if ((text[i]==' ' || text[i]==',' || text[i]=='.') && (text[i+1]!=' ' || text[i+1]!=',' || text[i+1]!='.') && (i+1!=strlen(text)))
              {
                    slovo[nslova][nbukva]=text[i];
                    nslova++;
                    i++;
              };
         if ((text[i]==' ' || text[i]==',' || text[i]=='.') && (text[i+1]!=' ' || text[i+1]!=',' || text[i+1]!='.') && (i+1==strlen(text)))
              {
                    slovo[nslova][nbukva]=text[i];
              };
      };
      
    i=0;
    while (i<=nslova)
      {
         cout<<"Слово № "<<i+1<<" = ";
         cout.width(6);
         cout<<slovo[i]<<" Длинна слова = "<<strlen(slovo[i])<<endl;
         i++;
      };
    cout<<endl;
 
    i=0;
    while(i<=nslova)
      {
         if ((strcmp(slovo[i]," ")==0) || (strcmp(slovo[i],",")==0) || (strcmp(slovo[i],".")==0))
             i++;
         else
         if ((strcmp(slovo[i]," ")>0) || (strcmp(slovo[i],",")>0) || (strcmp(slovo[i],".")>0) || (strcmp(slovo[i]," ")<0) || (strcmp(slovo[i],",")<0) || (strcmp(slovo[i],".")<0))
             {
                   nnslov[uknslov]=i;
                   uknslov++;
                   cout<<"Номер слова в массиве = ";
                   cout.width(3);
                   cout<<i+1;
                   cout<<" (номер в программе - ";
                   cout.width(3);
                   cout<<i;
                   cout<<")"<<endl;
                   i++;
             };
      };
    cout<<endl;
    
    uknslov--;    
    i=0;
    j=0;
    predpos=nnslov[uknslov-1];
    
    cout<<"[ИЗМЕНЯЕМОЕ СЛОВО] = ";
    while(j <= strlen (slovo[predpos]) )
        {
              newslovo[i]=slovo[predpos][j];
              i++;
              j++;
              newslovo[i]='*';
              i++;
        };
    cout<<newslovo<<endl<<endl;
    
    i=0;
    j=0;
    while(i<=nslova)
      {
          if (i==predpos) strcat(itog,newslovo);
          else
          if (i!=predpos) strcat(itog,slovo[i]);
          i++;
      };
    
    cout<<"[ИТОГОВАЯ СТРОКА]"<<endl;
    cout<<itog<<endl<<endl;    
    system("pause");
 
    return 0;
}
Задачу Я решил сделать так:
1) Вводится строка
2) Идёт цикл поиска слов и знаков
3) Идёт цикл поиска среди всего найденного слов
4) В допл. строку заносится по 1 символу из пред последнего слова, и заносится знак "*", перед тем, как занести след. символ пред последнего слова
5) Создаётся новая строка, куда заносятся все слова, кроме пред-последнего(взамен него заносится Наше новое слово)
6) Выводится результат на экран
0
Novi4ekC
81 / 81 / 33
Регистрация: 03.03.2013
Сообщений: 311
27.07.2013, 22:24 8
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
#include <stdio.h>
#define LIM 100
main()
{
 char str[LIM],*p=str;
 int i=1,n=0;
 printf("string:"); fgets(str,LIM,stdin);
 while(*p&&*p!='\n')
  {
   printf("\n%d. ",i++);
   if(*p==' '||*p==','||*p=='.')
    {
     printf("%c (len=1)",*p++);
     continue;
    }
   while(*p&&*p!=' '&&*p!=','&&*p!='.')
    {
     printf("%c",*p++);
     ++n;
    }
   printf(" (len=%d)",n);
   n=0;
  }
 i=1; p=str; printf("\n");
 while(*p&&*p!='\n')
  {
   if(*p==' '||*p==','||*p=='.')
    {
     ++i; p++;
     continue;
    }
   printf("\n%d - real number.",i++);
   while(*p!=' '&&*p!=','&&*p!='.') p++;
  }
 return 0;
}
0
27.07.2013, 22:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.07.2013, 22:24

В каждой строке для всех слов, которые встречаются в строке больше одного раза, оставить только первое вхождение
Народ, помогите Нужно в каждой строке для всех слов, которые встречаются в...

Поиск мин элемента в строке матрицы и приращение элементов в строке к нему (программа работает не правильно)
Есть матрица и функции поиска минимального элемента в строке и приращение ...

Подсчёт слов в строке
Составьте функцию wcount, вычисляющую количество слов в строке. Слово – это...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru