Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
0 / 0 / 0
Регистрация: 09.11.2015
Сообщений: 39
1

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

13.12.2015, 17:37. Просмотров 2147. Ответов 4
Метки нет (Все метки)


Приветствую! Такую вот программку реализовал.
Она считывает строку (как сделать, чтобы считывала сразу текст, и делала это уже везде, а не только в строке), и заменяет много пробелов на один, а также убирает пробелы перед знаками препинания. Попытался по аналогии сделать также, чтобы вставляла пробел после этих самых знаков, если их там нет. Но, увы, не получилось.. Помогите, пожалуйста!

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
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <fstream>
#include <iomanip>
#include <string>
using namespace std;
 
bool isPunctuation(char ch)
{
    std::string str;
    str = ch;
    return (str.find_first_of(".,!?[]") != std::string::npos);
}
 
int main()
{
    setlocale(LC_ALL, "Rus");
    char buffa[50];
    //ofstream test("zapis.txt", ios_base::out);
    ifstream test("zapis.txt");
    if (!test.is_open())
    {
        cout << "Error" << endl;
        return 1;
    }
    else
        test.getline(buffa, 50);
    test.close();
    cout << buffa << endl;
    string buff = buffa;
    string b;
    b += buff[0];
    for (int i = 1; i<buff.length(); i++)
    {
        if ((buff[i] != ' ') || ((buff[i] == ' ') && (buff[i - 1] != ' '))) 
            b += buff[i];
    }
 
    size_t pos = b.find(" ");
    while (pos != std::string::npos) {
        if ((pos + 1) < b.length()) {
            if (isPunctuation(b[pos + 1])) {
                b.erase(pos, 1);
            }
        }
        pos = b.find(" ", pos + 1, 1);
    }
 
    /*size_t newpos = b.find(".,!?[]"");
    while (pos != std::string::npos) {
        if ((newpos + 1) < b.length()) {
            if (isPunctuation(b[newpos + 1])) {
                b.insert(newpos, 1);
            }
        }
    }*/
 
    /*char ok[] = ".,?!:";
    for (int i = 0; b[i] != '\0'; i++)
        if (strchr(ok, b[i]) != NULL)
        {
            for (int t = strlen(b) - 1; t >= i; t--)
                b[t + 1] = b[t];
            b[i + 1] = ' ';
        }*/
 
        
 
    cout << b << endl;
    //cout << buff << "e" << endl;
    system("pause");
    return 0;
}
Добавлено через 57 секунд
Попробовал такую штуку

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
if (!test.is_open())
    {
        cout << "Error" << endl;
        return 1;
    }
    else
        while (!test.eof()) 
        {
 
            test.getline(buffa, sizeof(buffa));
            //test.close();
            cout << buffa << endl;
        }
Теперь читает все строки. Но изменяет только последнюю, и выводит, собственно только ее..
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.12.2015, 17:37
Ответы с готовыми решениями:

После каждого знака препинания (".", ",", ";") вставить в строку пробел, если там его нет
Выполните задания с использованием библиотечного класса string. Даны строка S. Необходимо после...

В заданном тексте после каждого знака препинания («.», «,», «:», «;») вставить пробел, если его там нет.
В заданном тексте после каждого знака препинания («.», «,», «:», «;») вставить пробел, если его там...

Проверить, содержится ли пробел после знака препинания, и если нет — вставить
Пропустил весь курс по болезни, судорожно осваиваю за день. Голова кипит со строками, вот задание...

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

4
Эксперт С++
3206 / 1733 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
13.12.2015, 21:33 2
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
137
138
139
140
#include <algorithm>
#include <cctype>
#include <fstream>
#include <iostream>
#include <iterator>
#include <string>
#include <vector>
///////////////////////////////////////////////////////////////////////////////
typedef std::string                     T_str;
typedef std::vector     < T_str     >   T_words;
///////////////////////////////////////////////////////////////////////////////
void   organize_punctuation
    (
        T_str   const   &   ifile_name,
        T_str   const   &   ofile_name
    )
{
    std::ifstream   ifile( ifile_name );
    std::ofstream   ofile( ofile_name );
 
    T_words         words;
 
    std::for_each
        (
            std::istream_iterator< T_str >  ( ifile ),
            std::istream_iterator< T_str >  (),
            
            [&]     ( T_str     const   &   word )
            {
                auto    new_begin   =   word.begin();
 
                for(;;)
                {
                    auto    new_end     =   std::find_if
                                                (
                                                    new_begin,
                                                    word.end(),
                                                    std::ispunct
                                                );
 
                    if  (
                            new_end     !=  word.end()  
                        )
                    {
                        ++new_end;
                    }
 
                    words.push_back
                        (
                            T_str   ( 
                                        new_begin,
                                        new_end
                                    )    
                        );
 
                    if  (
                            new_end     ==    word.end()
                        )
                    {
                        break;
                    }//if
 
                    new_begin   =  new_end;
                }//for
            }//lambld
        );
 
    T_words     words_1;
 
    std::for_each
        (
            words.begin     (),    
            words.end       (),
 
            [&]             ( T_str     const   &   word )
            {
                if  (
                            word.size()     ==  1
 
                        &&  std::ispunct
                                ( 
                                    word.front() 
                                )
 
                        &&  !words_1.empty()
                    )
                {
                    words_1.back().push_back
                        ( 
                            word.front()  
                        ); 
                }
                else
                {
                    words_1.push_back( word ); 
                }
            }
        );
 
    std::copy
        (
            words_1.begin                   (),
            words_1.end                     (),
            std::ostream_iterator< T_str >  ( ofile, " " )
        );
}
///////////////////////////////////////////////////////////////////////////////
void    print_with_title
    (
        T_str   const   &   file_name,
        T_str   const   &   title
    )
{
    std::fstream   file( file_name );
 
    std::cout   <<  title
                <<  std::endl
                <<  file.rdbuf()
                <<  std::endl
                <<  std::endl;
}
///////////////////////////////////////////////////////////////////////////////
int     main()
{
    std::locale::global(std::locale(""));
 
    const   T_str   IFILE_NAME  =   "i.txt";
    const   T_str   OFILE_NAME  =   "o.txt";
 
    organize_punctuation
        (
            IFILE_NAME,
            OFILE_NAME
        );
 
    print_with_title( IFILE_NAME,  "Исходный текст:"                            );
    print_with_title( OFILE_NAME,  "Текст с упорядоченными знаками препинания:" );
            
    system("pause");
}
1
0 / 0 / 0
Регистрация: 09.11.2015
Сообщений: 39
13.12.2015, 22:28  [ТС] 3
Как-то очень слоооожно, хоть и работает (хотя не совсем верно)
Это точно С++ для начинающих?)
Если можно, то как-то проще, либо объясните, потому что я почти ничего отсюда не понимаю..(

И вот текст: "Hello , how are you ?I'm very good!
But i'm feel cold in your heart ,Andrew.. "
Он идет в две строки. В консоли же печатается все в одну. Ну ладно. Еще суть в том, что она ставит пробелы после " ' ", а этого нужно избежать.. Вооот
0
Эксперт С++
3206 / 1733 / 435
Регистрация: 03.05.2010
Сообщений: 3,867
14.12.2015, 12:27 4
Цитата Сообщение от -ErshovlaD- Посмотреть сообщение
пробелы после " ' ", а этого нужно избежать
У вас ТЗ прямо на ходу меняется!
Сделал корректную обработку апострофов и кавычек, также сохраняется деление текста на строки.
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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
#include <algorithm>
#include <cctype>
#include <fstream>
#include <iostream>
#include <iterator>
#include <sstream>
#include <string>
#include <vector>
///////////////////////////////////////////////////////////////////////////////
typedef std::string                     T_str;
typedef std::vector     < T_str     >   T_words;
typedef T_words                         T_sentences;
///////////////////////////////////////////////////////////////////////////////
const   char    APOSTROPHE_SYMB     =   '\'';
const   char    QUOTE_SYMB          =   '"';
///////////////////////////////////////////////////////////////////////////////
void    select_punctuation_symbols_in_single_words
    ( T_words   &   words )
{
    T_words     words_new;
 
    std::for_each
        (
            words.begin     (),
            words.end       (),
            
            [&]             ( T_str     const   &   word )
            {
                auto    new_begin   =   word.begin();
 
                for(;;)
                {
                    auto    punct_it     
                        =   std::find_if
                                (
                                    new_begin,
                                    word.end(),
 
                                    [=]     ( char  symb )
                                    {
                                        return      std::ispunct( symb )
                                                &&  symb    !=  APOSTROPHE_SYMB; 
                                    }
                                );
 
                    if  (
                            punct_it     ==  word.end()  
                        )
                    {
                        words_new.push_back
                            (
                                T_str   ( 
                                            new_begin,
                                            punct_it
                                        )    
                            );
                       
                        break;
                    }
                    else
                    {
                        if( new_begin   !=  punct_it )
                        {
                            words_new.push_back
                                (
                                    T_str   ( 
                                                new_begin,
                                                punct_it
                                            )    
                                );
                        }//if
 
                        words_new.push_back
                            (
                                T_str   ( 
                                            punct_it,
                                            punct_it + 1
                                        )    
                            );
                    }
 
                    new_begin   =  punct_it + 1;
 
                    if  (
                            new_begin   ==   word.end()  
                        )
                    {
                        break;
                    }
                }//for
            }//lambda
        );
 
    words   =   words_new;
}
///////////////////////////////////////////////////////////////////////////////
void   append_punctuation_words_except_quotes_to_previous
    ( T_words   &   words )
{
    T_words     words_new;
 
    std::for_each
        (
            words.begin     (),    
            words.end       (),
 
            [&]             ( T_str     const   &   word )
            {
                if  (
                            word.size()     ==  1
 
                        &&  std::ispunct
                                ( 
                                    word.front() 
                                )
 
                        &&  word.front()    !=  QUOTE_SYMB
 
                        &&  !words_new.empty()
                    )
                {
                    words_new.back().push_back
                        ( 
                            word.front()  
                        ); 
                }
                else
                {
                    words_new.push_back( word ); 
                }
            }//lambda
        );
 
    words   =   words_new;
}
///////////////////////////////////////////////////////////////////////////////
T_words::iterator   find_word_quote_in
    ( T_words     &   words )
{
    return  std::find_if
        (
            words.begin     (),
            words.end       (),
 
            [=]             ( T_str     const   &   word )
            {
                return      word.size   ()  ==  1
                        &&  word.front  ()  ==  QUOTE_SYMB;
            }
        );
}
///////////////////////////////////////////////////////////////////////////////
void    paste_front_quotes_to_next_word_and_back_quotes_to_previous
    ( T_words   &   words )
{
    for(;;)
    {
        auto    front_quote_it  =   find_word_quote_in( words );
 
        if  (
                front_quote_it  ==  words.end()  
            )
        {
            break;
        }
 
        auto    next_word_it    =   front_quote_it + 1;
 
        if  (
                next_word_it    !=  words.end()  
            )
        {
            *front_quote_it     +=  *next_word_it;
            words.erase( next_word_it );
        }
 
        if  (
                *front_quote_it     ==  T_str( 2,   QUOTE_SYMB )
            )
        {
            continue;
        }
 
        auto    back_quote_it   =   find_word_quote_in( words );
 
        if  (
                back_quote_it  ==  words.end()  
            )
        {
            break;
        }
 
        auto    prev_word_it    =   back_quote_it - 1;
 
        *prev_word_it     +=  *back_quote_it;
        words.erase( back_quote_it );
    }//for
}
///////////////////////////////////////////////////////////////////////////////
void    to_words_ending_in_apostrophe_append_next_word
    ( T_words   &   words )
{
    for(;;)
    {
        auto    word_with_back_apostrophe_it
            =   std::find_if
                    (
                        words.begin     (),
                        words.end       (),
 
                        []              ( auto  const   &   word )
                        {
                            return  word.back()     ==  APOSTROPHE_SYMB; 
                        }
                    );
 
        if  (
                word_with_back_apostrophe_it    ==   words.end()  
            )
        {
            break;
        }
 
        auto    next_word_it    =   word_with_back_apostrophe_it + 1;
 
        if  (
                next_word_it    ==  words.end()  
            )
        {
            break;
        }
 
        *word_with_back_apostrophe_it   +=  *next_word_it;
        words.erase( next_word_it );
    }//for
}
///////////////////////////////////////////////////////////////////////////////
T_str   get_sentence_with_correct_punctuation
    ( T_str    const   &   sentence )
{    
    std::istringstream  istr( sentence );
    T_words     words;
 
    std::copy
        (
            std::istream_iterator< T_str >  ( istr ),
            std::istream_iterator< T_str >  (),
            std::back_inserter              ( words )                
        );       
 
    select_punctuation_symbols_in_single_words                  ( words );
    append_punctuation_words_except_quotes_to_previous          ( words );
    paste_front_quotes_to_next_word_and_back_quotes_to_previous ( words );
    to_words_ending_in_apostrophe_append_next_word              ( words );
 
    std::ostringstream  ostr;
 
    std::copy
        (
            words.begin                         (),
            words.end                           (),
            std::ostream_iterator < T_str >     ( ostr, " " )
        );
 
    return  ostr.str();
}
///////////////////////////////////////////////////////////////////////////////
void   organize_text_punctuation
    (
        T_str   const   &   ifile_name,
        T_str   const   &   ofile_name
    )
{
    std::ifstream   ifile( ifile_name );
    std::ofstream   ofile( ofile_name );
 
    T_sentences     sentences;
    T_str           cur_sentence;
 
    while   (
                getline( ifile,     cur_sentence )
            )
    {
        sentences.push_back
            ( 
                get_sentence_with_correct_punctuation  ( cur_sentence )
            );
    }//while
 
    std::copy
        (
            sentences.begin                 (),
            sentences.end                   (),
            std::ostream_iterator< T_str >  ( ofile, "\n" )
        );
}
///////////////////////////////////////////////////////////////////////////////
void    print_with_title
    (
        T_str   const   &   file_name,
        T_str   const   &   title
    )
{
    std::fstream   file( file_name );
 
    std::cout   <<  title
                <<  std::endl
                <<  file.rdbuf()
                <<  std::endl
                <<  std::endl;
}
///////////////////////////////////////////////////////////////////////////////
int     main()
{
    std::locale::global(std::locale(""));
 
    const   T_str   IFILE_NAME  =   "i.txt";
    const   T_str   OFILE_NAME  =   "o.txt";
 
    std::ofstream   file( "i.txt" );
 
    file   <<  "" " " "  Hello , " how " are "  " you ?I ' m very good !"
            <<  std::endl
            <<  "But i   '   m feel" cold "in" your "heart ,Andrew . ."
            <<  std::endl;
 
    organize_text_punctuation
        (
            IFILE_NAME,
            OFILE_NAME
        );
 
    print_with_title( IFILE_NAME, "Исходный текст:"                            );
    print_with_title( OFILE_NAME, "Текст с упорядоченными знаками препинания:" );
            
    system("pause");
}
Добавлено через 5 минут
Что-то в строковых литералах обратный слэш перед кавычками при вставке программы куда-то волшебным образом исчезает.
0
822 / 625 / 940
Регистрация: 26.06.2015
Сообщений: 1,409
14.12.2015, 14:19 5
Лучший ответ Сообщение было отмечено -ErshovlaD- как решение

Решение

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
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#define  is_pend(c)\
((c) == '.' || (c) == ',' || (c) == '!' || (c) == '?')
 
void output_str(std::string& s, std::istream& _in){
    char c, p = 0;
    s = "";
    while(_in.get(c) && !_in.fail()){
        if(c == ' '){
            if(c != p)
                s += c;
        } else if(is_pend(c)){
            if((s.length() > 0) && (s[s.length() - 1] == ' '))
                s.erase(s.begin() + (s.length() - 1));
            s += c;
        } else {
            if((c != ' ') && (c != '\n') && is_pend(p)){
                s.insert(s.end(), ' ');
                s += c;
                c  = ' ';
            } else
                s += c;
        }
        p = c;
    }
}
 
int main(void){
    std::string s;
 
    char b[] = "Hello  , how ,are  ,you?I'm ,very      good !  !   !\n"\
               "bla-bla   . . .lisp  !\n"\
               "Fox  ,    dog     ! ! !apl .     end .";
    std::istringstream sp(b);
    output_str(s, sp);
    std::cout << s;
 
/*  обработка из файла
    std::ifstream fp("file.txt");
    output_str(s, fp);
    fp.close();
    std::cout << s << std::endl;
*/
    return 0;
}
Пример работы кода
2
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.12.2015, 14:19

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Написать функцию, которая проверяет что в строке содержится один пробел после знака препинания, и если нет - вставляет.
Написать функцию, которая проверяет что в строке, переданной в качестве аргумента, содержится один...

Ввести строку символов и вставить пробел после каждого знака препинания
А как это будет написано на с#? &quot;Ввести строку символов и вставить пробел после каждого знака...

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

Добавить пробелы после знаков препинания, если их там нет
Написать программу, выполняющую чтение текстового файла“input.in” и выполняющую его преобразование...


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

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

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