1 цикл.
можно значительно упростить, как сейчас понял.
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
| std::string remove_comment(const std::string &in) {
enum state_t {
state_clean = 0,
state_start,
state_rem,
state_stop
} state = state_clean;
std::string clean;
std::string out;
std::string::const_iterator itr;
size_t len = in.size();
clean.reserve(len);
out.reserve(len);
std::string *cursor = &out;
bool use_clean = false;
for(itr = in.begin(); itr!=in.end(); ++itr) {
switch( state ) {
case state_clean:
if(*itr == '/') state = state_start;
else cursor->push_back(*itr);
break;
case state_start:
if(*itr == '*') {
if( use_clean ) {
use_clean = false;
cursor = &out;
out += clean;
clean.clear();
}
state = state_rem;
} else {
cursor->push_back('/');
cursor->push_back(*itr);
state = state_clean;
}
break;
case state_rem:
if(*itr == '*') state = state_stop;
else if(*itr == '/') state = state_start;
else if( use_clean ) cursor->push_back(*itr);
break;
case state_stop:
if( *itr == '/' ) {
use_clean = true;
clean.clear();
cursor = &clean;
} else {
cursor->push_back('*');
cursor->push_back(*itr);
}
state = state_rem;
break;
}
}
if(!clean.empty()) out += (clean);
return out;
} |
|
C++ |
1
2
3
| std::string rem_str = "Kirje sinulle /* а это комент, да */ kyllГ¤! siina kaiiki; конец коммента */ siina kaikki.";
cout << remove_comment(rem_str); |
|
Bash |
1
| Kirje sinulle siina kaikki. |
|
может где есть какие глюки. не проверял сильно.