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

Проверить правильность расстановки символов “/*” и “*/” для комментариев - C++

Восстановить пароль Регистрация
 
satanehl
1 / 1 / 0
Регистрация: 06.10.2011
Сообщений: 7
19.10.2011, 10:23     Проверить правильность расстановки символов “/*” и “*/” для комментариев #1
Проверить правильность расстановки символов “/*” и “*/” для комментариев в фрагменте программы на языке С++.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.10.2011, 10:23     Проверить правильность расстановки символов “/*” и “*/” для комментариев
Посмотрите здесь:

Проверить правильность расстановки и вложенности скобок в тексте (абстрактный стек) C++
C++ Дана строка символов проверить правильность расстановки круглых и квадратных скобок в выражениях
Проверить правильнсть расстановки круглых скобкок C++
C++ Использование стека. Дана строка символов. Проверьте правильность расстановки в ней круглых скобок.
C++ Проверить правильность расстановки скобок
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
19.10.2011, 10:27     Проверить правильность расстановки символов “/*” и “*/” для комментариев #2
satanehl, посчитать количество символов начала комментариев "/*" и конца комментариев "*/". Их разница должна быть равна нулю, в простейшем случае.
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,390
19.10.2011, 10:40     Проверить правильность расстановки символов “/*” и “*/” для комментариев #3
fasked, не получится:
C
1
*/ wrong comment /*
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
19.10.2011, 10:41     Проверить правильность расстановки символов “/*” и “*/” для комментариев #4
Nameless One, стеком.

Не по теме:

утро такое утро

Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,390
19.10.2011, 10:42     Проверить правильность расстановки символов “/*” и “*/” для комментариев #5
Ну и от себя предложу вариант с конечным автоматом
diagon
Higher
 Аватар для diagon
1920 / 1186 / 49
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
19.10.2011, 10:48     Проверить правильность расстановки символов “/*” и “*/” для комментариев #6
Цитата Сообщение от fasked Посмотреть сообщение
satanehl, посчитать количество символов начала комментариев "/*" и конца комментариев "*/". Их разница должна быть равна нулю, в простейшем случае.
C++
1
std::string str("/* not comment...");
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
19.10.2011, 10:57     Проверить правильность расстановки символов “/*” и “*/” для комментариев #7
diagon,
Цитата Сообщение от diagon Посмотреть сообщение
в простейшем случае.
я имел в виду именно это
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,390
19.10.2011, 11:44     Проверить правильность расстановки символов “/*” и “*/” для комментариев #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
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
#include <stdio.h>
#include <stdlib.h>
 
/* состояние автомата */
enum state
{
    NONE,
    COMMENT,
    STRING_LITERAL,
    END_OF_FILE,
    ERROR
};
 
/* используется для проверки символа комментария
 * в строковом литерале.
 * И да, это многострочный комментарий
 */
void silly_fun(const char* unused)
{
}
 
int main(int argc, char* argv[])
{
    enum state state;       /* текущее состояние */
    char prev, curr;        /* предыдущий и текущий символы */
 
    int ret;
    
    state = NONE;
 
    ret = scanf("%c", &prev);
 
    if(ret == EOF)
    state = END_OF_FILE;
    
    while(state != END_OF_FILE && state != ERROR)
    {
    ret = scanf("%c", &curr);
 
    switch(state)
    {
    case NONE:
 
        if(ret == EOF)
        state = END_OF_FILE;
        
        else if(curr == '*' && prev == '/')
        state = COMMENT;
 
        else if(curr == '\"')
        state = STRING_LITERAL;
        
        break;
 
    case COMMENT:
        /* внутри комментария */
        if(ret == EOF)
        state = ERROR;
        
        else if(curr == '/' && prev == '*')
        state = NONE;
                
        break;
 
    case STRING_LITERAL:
        /* внутри строкового литерала */
        if(ret == EOF)  /* по идее ошибка, но она не имеет отношения
                 * к проверке правильности комментариев */
        state = END_OF_FILE;
        
        else if(curr == '\"')
        state = NONE;
 
        break;
 
    case END_OF_FILE:
        /* этого никогда не случится */
        break;
 
    case ERROR:
        /* этого никогда не случится */
        break;
    }
    prev = curr;
    }
 
    if(state == ERROR)
    puts("Oh, no!"), exit(1);
 
    puts("OK");
    
    silly_fun("wrong /* comment inside of a string literal");
    
    exit(0);
}
тест
Код
[nameless@desktop c]$ cat main.c | ./sample # проверяем сами себя
OK
[nameless@desktop c]$ for i in /usr/include/*.h; do echo -ne "$i\t"; cat $i | ./sample; done/usr/include/aio.h	OK
/usr/include/aliases.h	OK
/usr/include/alloca.h	OK
/usr/include/a.out.h	OK
/usr/include/argp.h	OK
/usr/include/argz.h	OK
/usr/include/ar.h	OK
/usr/include/assert.h	OK
/usr/include/autosprintf.h	OK
/usr/include/byteswap.h	OK
/usr/include/complex.h	OK
/usr/include/cpio.h	OK
/usr/include/crypt.h	OK
/usr/include/ctype.h	OK
/usr/include/dirent.h	OK
/usr/include/dlfcn.h	OK
/usr/include/elf.h	OK
/usr/include/endian.h	OK
/usr/include/envz.h	OK
/usr/include/err.h	OK
/usr/include/errno.h	OK
/usr/include/error.h	OK
/usr/include/execinfo.h	OK
/usr/include/fcntl.h	OK
/usr/include/features.h	OK
/usr/include/fenv.h	OK
/usr/include/FlexLexer.h	OK
/usr/include/fmtmsg.h	OK
/usr/include/fnmatch.h	OK
/usr/include/fpu_control.h	OK
/usr/include/fstab.h	OK
/usr/include/ft2build.h	OK
/usr/include/fts.h	OK
/usr/include/ftw.h	OK
/usr/include/_G_config.h	OK
/usr/include/gconv.h	OK
/usr/include/GeoIPCity.h	OK
/usr/include/GeoIP.h	OK
/usr/include/GeoIPUpdate.h	OK
/usr/include/getopt.h	OK
/usr/include/gettext-po.h	OK
/usr/include/glob.h	OK
/usr/include/gmp.h	OK
/usr/include/gmp-i386.h	OK
/usr/include/gmp-mparam.h	OK
/usr/include/gmp-mparam-i386.h	OK
/usr/include/gmpxx.h	OK
/usr/include/gnu-versions.h	OK
/usr/include/grp.h	OK
/usr/include/gshadow.h	OK
/usr/include/gssapi.h	OK
/usr/include/iconv.h	OK
/usr/include/ieee754.h	OK
/usr/include/ifaddrs.h	OK
/usr/include/inttypes.h	OK
/usr/include/kdb.h	OK
/usr/include/keyutils.h	OK
/usr/include/krb5.h	OK
/usr/include/langinfo.h	OK
/usr/include/lastlog.h	OK
/usr/include/libgen.h	OK
/usr/include/libintl.h	OK
/usr/include/libio.h	OK
/usr/include/limits.h	OK
/usr/include/link.h	OK
/usr/include/locale.h	OK
/usr/include/malloc.h	OK
/usr/include/math.h	OK
/usr/include/mcheck.h	OK
/usr/include/memory.h	OK
/usr/include/mntent.h	OK
/usr/include/monetary.h	OK
/usr/include/mp.h	OK
/usr/include/mqueue.h	OK
/usr/include/netapi.h	OK
/usr/include/netdb.h	OK
/usr/include/nl_types.h	OK
/usr/include/nss.h	OK
/usr/include/obstack.h	OK
/usr/include/paths.h	OK
/usr/include/poll.h	OK
/usr/include/printf.h	OK
/usr/include/profile.h	OK
/usr/include/pthread.h	OK
/usr/include/pty.h	OK
/usr/include/pwd.h	OK
/usr/include/re_comp.h	OK
/usr/include/regex.h	OK
/usr/include/regexp.h	OK
/usr/include/resolv.h	OK
/usr/include/sched.h	OK
/usr/include/search.h	OK
/usr/include/semaphore.h	OK
/usr/include/setjmp.h	OK
/usr/include/sgtty.h	OK
/usr/include/shadow.h	OK
/usr/include/signal.h	OK
/usr/include/spawn.h	OK
/usr/include/stab.h	OK
/usr/include/stdint.h	OK
/usr/include/stdio_ext.h	OK
/usr/include/stdio.h	OK
/usr/include/stdlib.h	OK
/usr/include/strata_client.h	OK
/usr/include/string.h	OK
/usr/include/strings.h	OK
/usr/include/syscall.h	OK
/usr/include/sysexits.h	OK
/usr/include/syslog.h	OK
/usr/include/tar.h	OK
/usr/include/termio.h	OK
/usr/include/termios.h	OK
/usr/include/tgmath.h	OK
/usr/include/thread_db.h	OK
/usr/include/time.h	OK
/usr/include/ttyent.h	OK
/usr/include/ucontext.h	OK
/usr/include/ulimit.h	OK
/usr/include/unistd.h	OK
/usr/include/ustat.h	OK
/usr/include/utime.h	OK
/usr/include/utmp.h	OK
/usr/include/utmpx.h	OK
/usr/include/values.h	OK
/usr/include/wait.h	OK
/usr/include/wchar.h	OK
/usr/include/wctype.h	OK
/usr/include/wordexp.h	OK
/usr/include/xf86drm.h	OK
/usr/include/xf86drmMode.h	OK
/usr/include/xlocale.h	OK
/usr/include/zconf.h	OK
/usr/include/zlib.h	OK
[nameless@desktop c]$
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.10.2011, 11:00     Проверить правильность расстановки символов “/*” и “*/” для комментариев
Еще ссылки по теме:

Проверить правильность расстановки в тексте круглых скобок C++
Проверить код на правильность C++
Написать рекурсивную функцию, проверяющую правильность расстановки круглых скобок в строке C++

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

Или воспользуйтесь поиском по форуму:
Mr.X
Эксперт С++
 Аватар для Mr.X
2796 / 1572 / 246
Регистрация: 03.05.2010
Сообщений: 3,649
22.10.2011, 11:00     Проверить правильность расстановки символов “/*” и “*/” для комментариев #9
Сообщение было отмечено автором темы, экспертом или модератором как ответ
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
/////////////////////////////////////////////////////////////////////////////////////////
//Проверить правильность расстановки символов “/*” и “*/” для комментариев 
//во фрагменте программы на языке С++. 
/////////////////////////////////////////////////////////////////////////////////////////
#include <cctype>
#include <fstream>
#include <iostream>
#include <sstream>
#include <string>
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::string         T_str;
typedef T_str::size_type    T_pos;
/////////////////////////////////////////////////////////////////////////////////////////
const char  SLASH           = '/';
const char  ASTERISK        = '*';
const char  BACKSLASH       = '\\';
const char  SINGLE_QUOTE    = '\'';
const char  DOUBLE_QUOTE    = '"';
/////////////////////////////////////////////////////////////////////////////////////////
enum  T_state
{
    TEXT_STATE,
    C_COMMENT_STATE,
    CPP_COMMENT_STATE,
    SYMB_LITERAL_STATE,
    STR_LITERAL_STATE,
    ERROR_STATE
};
/////////////////////////////////////////////////////////////////////////////////////////
void  TEXT_STATE_parse
    (
        const T_str&    s,
        int             symb_ind,
        int             str_ind,                        
        int&            C_comment_begin_symb_ind,                      
        int&            C_comment_begin_str_ind,                        
        T_state&        cur_state
    )
{
    switch( s[symb_ind] )
    {
    //Начало C-комментария.
    case ASTERISK:
        if(
                symb_ind            !=  0            
            &&  s[symb_ind - 1]     ==  SLASH 
          )
        {
            cur_state               = C_COMMENT_STATE;
            C_comment_begin_symb_ind  = symb_ind - 1;
            C_comment_begin_str_ind   = str_ind;            
        }
        break;
 
    //Конец C-комментария или начало C++-комментария.
    case SLASH:
        if(symb_ind != 0)
        {
            switch( s[symb_ind - 1] )
            {
            case  ASTERISK:
                cur_state = ERROR_STATE;
                break;
 
            case  SLASH:
                if( symb_ind != s.size() - 1 )
                {
                    cur_state = CPP_COMMENT_STATE;
                }
                break;
            }
        }
        break;
 
    case SINGLE_QUOTE:
        if( symb_ind == s.size() - 1 )
        {
            cur_state = ERROR_STATE;
        }
        else
        {
            cur_state = SYMB_LITERAL_STATE;
        }        
        break;
 
    case DOUBLE_QUOTE:
        if( symb_ind == s.size() - 1 )
        {
            cur_state = ERROR_STATE;
        }
        else
        {
            cur_state = STR_LITERAL_STATE;
        }              
        break;
    }
}
/////////////////////////////////////////////////////////////////////////////////////////
void  C_COMMENT_STATE_parse
    (
        const T_str&    s,
        int             symb_ind,
        int             str_ind,                        
        int&            C_comment_begin_symb_ind,                      
        int&            C_comment_begin_str_ind,                        
        T_state&        cur_state
    )
{
    switch( s[symb_ind] )
    {
    case  SLASH:
        if(
                symb_ind            !=  0
            &&  s[symb_ind - 1]     ==  ASTERISK
            &&  (       
                        str_ind    !=   C_comment_begin_str_ind
                    ||  symb_ind - 1 - C_comment_begin_symb_ind > 1
                )
          )
        {
            cur_state = TEXT_STATE;
        }
        break;
    }
}
/////////////////////////////////////////////////////////////////////////////////////////
void  CPP_COMMENT_STATE_parse
    (
        const T_str&    s,
        int             symb_ind,
        T_state&        cur_state
    )
{
    //Если это последний непробельный символ в строке, то.
    if( symb_ind == s.size() - 1 )
    {
        cur_state = TEXT_STATE;
    }
}
/////////////////////////////////////////////////////////////////////////////////////////
void  SYMB_LITERAL_STATE_parse
    (
        const T_str&    s,
        int             symb_ind,
        T_state&        cur_state
    )
{
    switch( s[symb_ind] )
    {
    case  SINGLE_QUOTE:
        if( s[symb_ind - 1] != BACKSLASH )
        {
            cur_state = TEXT_STATE;
        }
        break;
 
    default:
        //Если это последний непробельный символ в строке, то.
        if( symb_ind == s.size() - 1 )
        {
            cur_state = ERROR_STATE;
        }
    }
}
/////////////////////////////////////////////////////////////////////////////////////////
void  STR_LITERAL_STATE_parse
    (
        const T_str&    s,
        int             symb_ind,
        T_state&        cur_state
    )
{
    switch( s[symb_ind] )
    {
    case  DOUBLE_QUOTE:
        if( 
                symb_ind            == 0
            ||  s[symb_ind - 1]     != BACKSLASH 
          )
        {
            cur_state = TEXT_STATE;
        }
        break;
 
    default:
        //Если это последний непробельный символ в строке и это не обратный слэш, то.
        if(
                symb_ind        ==  s.size() - 1               
            &&  s[symb_ind]     !=  BACKSLASH
          )
        {
            cur_state = ERROR_STATE;
        }
        break;
    }
}
/////////////////////////////////////////////////////////////////////////////////////////
bool  C_comments_in_CPP_text_are_correct
    (
        const T_str&    ifilename,
        bool&           file_is_open
    )
{
    std::ifstream   ifile( ifilename.c_str() );
    file_is_open = ifile != 0;
    if( !file_is_open )
    {
        return  false;
    }
 
    T_str       s;             
    
    T_state     cur_state                   = TEXT_STATE;
    int         str_ind                     = 0; 
 
    int         C_comment_begin_symb_ind    = 0;
    int         C_comment_begin_str_ind     = 0;   
 
    //Обрабатываем строки файла.
    while( getline(ifile, s) )
    {  
        ++str_ind;
 
        while( 
                    !s.empty()
                &&  isspace( *s.rbegin() ) 
             )
        {
            s.erase( s.size() - 1 );
        }        
        
        for(size_t  symb_ind = 0; symb_ind < s.size(); ++symb_ind)
        {               
            switch(cur_state)
            {
            case  TEXT_STATE:
                TEXT_STATE_parse
                    (
                        s,
                        symb_ind,
                        str_ind,                        
                        C_comment_begin_symb_ind,                      
                        C_comment_begin_str_ind,                        
                        cur_state
                    );
                break;
 
            case  C_COMMENT_STATE:
                C_COMMENT_STATE_parse
                    (
                        s,
                        symb_ind,
                        str_ind,
                        C_comment_begin_symb_ind,                      
                        C_comment_begin_str_ind,                        
                        cur_state
                    );
                break;
 
            case  CPP_COMMENT_STATE:
                CPP_COMMENT_STATE_parse
                    (
                        s,
                        symb_ind,
                        cur_state
                    );
                break;
 
            case  SYMB_LITERAL_STATE:
                SYMB_LITERAL_STATE_parse
                    (
                        s,                        
                        symb_ind,
                        cur_state
                    );
                break;
 
            case  STR_LITERAL_STATE:
                STR_LITERAL_STATE_parse
                    (
                        s,
                        symb_ind,
                        cur_state
                    );
                break;
 
            case  ERROR_STATE:
                return  false;
            }//switch            
        }//for
    }//while
    return  cur_state == TEXT_STATE;
}
/////////////////////////////////////////////////////////////////////////////////////////
int main()
{    
    std::locale::global(std::locale(""));
    T_str   ifilename       =   "f.txt";
    bool    file_is_open    =   false; 
    bool    bool_res        =   C_comments_in_CPP_text_are_correct
                                    (
                                        ifilename,
                                        file_is_open
                                    );
 
    if( !file_is_open )
    {
        std::cout << "Невозможно открыть файл \""
                  << ifilename
                  << "\"."
                  << std::endl;    
    }
    else
    {
        std::cout << "В файле "
                  << ifilename
                  << " C-комментарии во фрагменте программы на C++"
                  << (bool_res ? "" : " НЕ")
                  << " корректны."
                  << std::endl;
    }    
}
Yandex
Объявления
22.10.2011, 11:00     Проверить правильность расстановки символов “/*” и “*/” для комментариев
Ответ Создать тему
Опции темы

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