Дан многострочный текст (char text[20][81]). Определите, есть ли в данном тексте
указанное слово и заключите его в квадратные скобки. Слово – это непрерывная
последовательность букв и/или цифр. Разделителями слов могут быть любые другие
символы.
Реализовать и использовать функцию, которая заключает слово в квадратные скобки:
void markWords(char str[81], const char word[21]);
Входные данные:
str - исходная строка
word - выделяемое слово
Выходные данные:
str - строка с выделенными словами
Реализовать и использовать функцию поиска слова в строке:
int searchWord(const char str[81], const char word[21]);
Входные данные:
str – исходная строка
word – искомое слово
Формат входных данных. [слово] [M] [1-я строка] [2-я строка] и т.д. M – кол-во строк
в тексте, целое число в диапазоне [1, 20].
Формат выходных данных. [1-я строка] [перевод строки] [2-я строка] и т.д; пустые
строки не печатать; если все строки пустые, то напечатайте сообщение «no solution».
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
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
131
132
133
134
135
136
| #include "stdafx.h"
#include "testing.h"
#include <stdio.h>
int searchWord(const char str[81],const char word[21])
{
int j=0; //Счетчик цикла
int isFind=0; //Флаг наличия в строке искомого слова
int beginInd; //Индекс первой буквы искомого слова
int endInd; //Индекс первого символа, следущего за словом
int identity; //Флаг идентичности найденного слова с искомым
//До конца строки переворачиваем искомое слово
while (str[j]!='\0')
{
//Ищем индекс первого элемента очередного слова
while (!isalnum(str[j]))
{
j++;
}
beginInd=j;
//Ищем индекс первого элемента после этого слова
while (isalnum(str[j]))
{
j++;
}
endInd=j;
//Проверяем идентичность первых символов очередного слова с искомым
identity=strncmp(str+beginInd, word, strlen(word));
//Возвращаем индекс вхождения слова в тексте если оно искомое
if((strlen(word)==endInd-beginInd)&&(identity==0))
{
isFind=1;
return beginInd;
}
//Переходим к следующему элементу
else if(str[j]!='\0') j++;
}
//Если слово в строке не обнаружено возвращаем -1
if(!isFind)
return (-1);
}
void markWords(char str[81], const char word[21]) // У МЕНЯ НЕ ПРАВИЛЬНО РЕАЛИЗОВАНА ЭТА ФУНКЦИЯ Т.Е. НАДО ПОСТАВИТЬ УСЛОВИЕ, ЧТО БЫ МОЖНО БЫЛО ПРОВЕРИТЬ ОКРУЖЕНО ЛИ СЛОВО РАЗДЕЛИТЕЛЕМ (РАЗДЕЛИТЕЛЕ ЯВЛЯЕТСЯ ПРОБЕЛ!!! и НИЧТО ДРУГОЕ!) воТ КАК ЭТО СДЕЛАТЬ!?
{
char *direction;
char buffer[81]={'\0'}; // пустой массив для хранения строки в цикле
const int word_length=strlen(word); //находим длину строки
for (int i=0; i<81; i++)
{
//присваиваем адрес рассматриваемой ячейки указателю
direction = &(str[i]);
if (!strncmp(direction,word,word_length))
{
// копируем часть после слова в буффер
strcpy(buffer,direction+word_length);
// ставим скобку
str[i]=('[');
// копируем слово (и оставщуюся часть строки) на одну ячейку правее
strcpy(direction+1,word);
// копируем значение буффера в место после найденного слова (учитывая будущую скобку)
strcpy(direction+word_length+2,buffer);
// закрываем скобку
str[i+word_length+1]=(']');
// смещаем поиск на +1(+2 в конце цикла),чтобы не наткнуться на это же слово (потому что мы поставили скобку)
i++;
}
}
}
int _tmain(int argc, _TCHAR* argv[])
{
const int str = 20; // количество строк
const int smb = 81; // количество символов в строке
int M; // количество...
char M_char[20]; // ...строк в тексте
char text[str][smb]={'\0'}; // пустую матрицу для многострочного текста
char word[smb]={'\0'}; // пустой массив для слова
int ok=1,no_line=1,only_white=1; // объявляем флаги
/* ВВОДИМ */
// ... слово
gets(word);
// ... количество строк в тексте (M)
input_printf("input M: ");
gets(M_char);
M=atoi(
M_char);
if(M>str||M<1)
{ error_printf("invalid input data"); ok=0; }
if(ok)
{
// ... текст
for(int i=0; i<M; i++)
{
input_printf("input string #%d: ", i+1);
gets(text[i]);
// проверка на белые разделители
int j=0; while(text[i][j]!='\0')
{
if (isalpha(text[i][j])) { only_white=0; }
// ! РАЗДЕЛИТЕЛЯМИ СЛОВ МОГУТ БЫТЬ ЛЮБЫЕ ДРУГИЕ СИМВОЛЫ
// заменяем символы на пробелы | нужно ли?! Второй вопрос!?
// else text[i][j]=' ';
j++;
}
// если в строке лишь белые разделители,то делаем строку пустой
if(only_white==1) { text[i][0]='\0'; }
}
/* ИЩЕМ,ВЫВОДИМ,ПРОВЕРЯЕМ */
for(int i=0; i<M; i++)
{
// ИЩЕМ указанное слово и заключаем его в скобки
markWords(text[i],word);
// ВЫВОДИМ измененный текст
puts(text[i]);
// ПРОВЕРЯЕМ не пуста ли строчка*/
if(text[i][0]!='\0') { no_line=0;}
}
// если все строки пустые
if(no_line) puts("no solution");
}
WAIT_ANY_KEY
return 0;
} |
|