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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 36, средняя оценка - 4.86
recovery101
1 / 1 / 0
Регистрация: 10.06.2011
Сообщений: 10
#1

Удалить комментарии из строки - C++

14.09.2011, 15:19. Просмотров 4645. Ответов 48
Метки нет (Все метки)

Привет. Вообщем такая задача: Прочитать из файла строку символов. Удалить из этой строки комментарии вида "/* ... */" (вложенные комментарии тоже удалить) . Новую строку не создавать. Вывести исходную и преобразованную строки.
Т.е. например: дана строка "gfsgsdsf /* jhasd */ asdas" и на выходе он выдает "gfsgsdsf asdas". Вот мой код
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
#include "stdafx.h"
#include <conio.h>
#include <stdio.h>
#include <iostream>
using namespace std;
void main ()
{
   setlocale (0,"Rus");
   int m = 0, n = 0;
   FILE * f;
   char buf[100];
   int length;
   f = fopen ("C:\\okfile.txt", "r");
   if (f == NULL) 
       perror ("Ошибка");
   else 
   {
     fgets (buf, 100 , f);
     puts (buf);
     fclose (f);
   }
   length = strlen(buf);
   for(int i = 0; i < length ; i++)
   {
       if ((buf[i] == '/') && (buf[i + 1] == '*'))
       {
          m = i;
       }
       if ((buf[i - 1] == '*') && (buf[i] == '/'))   
       {
          n = i;   
       }
       if ((m != 0) && (i == n))
       {
       int len = strlen(buf)-m;
       memmove(buf+m-1, buf+n+1, len);
       }
   }
   puts (buf);
   getch();
}
Но он не удаляет вложенные комментарии (комментарии в комментарии), т.е. надо чтобы при вводе строки "asdasd /* asd /*123*/ dsa*/ asdasd" выводил "asdasd asdasd".
Помогите пожалуйста исправить.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.09.2011, 15:19
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Удалить комментарии из строки (C++):

Удалить из строки комментарии вида '/* . */". Игнорировать вложенные комментарии - C++
Всем привет! есть строка вида : char str=&quot;abc/*111/*def/*222*/ghi*/333*/jkl&quot;; нужно получить abc /*def ghi*/ jkl Реально ли так...

Удалить из строки комментарии вида '/* ... */". Игнорировать вложенные комментарии. - C++
#include &lt;iostream&gt; #include &lt;stdio.h&gt; #include &lt;string.h&gt; using namespace std; int main(int argc, char *argv) { ...

Удалить из строки слова, которые встречаются заданное число раз (нужны комментарии) - C++
Помогите пояснить программу пожалуйста? Написать комментарии к каждой строке?) #include &lt;iostream&gt; #include &lt;string&gt; #include...

Удалить комментарии из файлов С и С++ - C++
Создать функцию удаляющую комментарии из файлов С и С++. Функция принимает в качестве параметра имя входного и выходного файлов и удаляет...

Удалить комментарии из фаила - C++
Здравствуйте. Есть вот такие фаилы: # 3ds Max Wavefront OBJ Exporter v0.97b - (c)2007 guruware # File Created: 07.12.2014...

Прочитать программу на языке C++ и удалить все комментарии - C++
кто-нибудь)помогите написать эту программу=\

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
villu
203 / 203 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
15.09.2011, 12:56 #16
нерабочий код
C++
1
2
char test0[] = "***/";
char test1[] = "132/**/*/**/456789";
1: T
2: 132Tc56789

c char test1[] = "132/*comment*/*/*comment*/456789"

вообще что-то непонятное
132Нomment456789
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
15.09.2011, 13:52 #17
villu, глюки из-за string::operator+= применительно к char.

Вот исправленный вариант.

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
string nocomment( char * str )
{
    int level = 0;
    string out;
 
    char prev = 0,
         buff[2] = {0, 0};
 
    for( char *p = str; *p; p++ )
    {
        //cout << '\n' << *p << ": ";
 
        if( *p == '/' )
        {
            if( prev == '*' ) // закрываюший коммент
            {
                if( !level )
                {
                   prev = 0;
                   //cout << "closing comment outside of comment area ";
                   out += "/";
                   continue;
                }
 
                level--;
                prev = 0;
 
                //cout << "closing comment. level is now " << level << ' ';
 
                continue;
            }
 
            prev = *p;
            continue;
        }
        else if( *p == '*' )
        {
            if( prev == '/' ) // открываюший коммент
            {
                level++;
 
                //cout << "opening comment. level is now " << level << ' ';
 
                prev = 0;
                continue;
            }
 
            prev = *p;
 
            //continue;
        }
 
        if( !level )
        {
            prev = *p;
            buff[0] = *p;
            out += buff;
        }
    }
 
    return out;
}
 
int main()
{
    cout << "output: " << nocomment( "Hello, /*world*/sailor! How /* is /* your /* comment */ */ doing?**/do/* */ you/***/ do?" )
         << '\n' << nocomment( "***/" ) <<
         '\n' << nocomment( "132/**/*/**/456789" );
 
    return 0;
}
Единственное - непонятно, что вы ожидаете увидеть в строке

/**/*/**/

Цвета:
Открывающий, закрывающий, закрывающий вне комментария, просто текст

Если я понял правильно, тогда будет так:

*/**/

(закрывающий вне коммента, просто текст, опять закрывающий вне коммента)
villu
203 / 203 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
15.09.2011, 14:05 #18
нет не павильно

/**/*/**/

YellowGreen - открыт
DarkOrchid - закрыт

у меня, кстати в коде тож косяк

1234/**/***/**/56789
должно получиться
1234***56789

поправил.
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
15.09.2011, 14:09 #19
villu, вот два выражения:

/**/*/**/
/**/*/**/

в первом случае приоритет имеет */, как "закрывающий", а во втором - /*, как "открывающий". как их отличать-то?
villu
203 / 203 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
15.09.2011, 14:11 #20
talis зайди в ЛЮБОЙ редактор, который умеет подсвечивать такие комменты и посмотри.

и ситуацию с 1234/**/***/**/56789 тоже посмотри.
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
15.09.2011, 14:12 #21
villu, редактор не понимает вложенные комменты (так как их не понимает компилятор). Задача меняется.
villu
203 / 203 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
15.09.2011, 14:14 #22
как-то так
Изображения
 
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
15.09.2011, 14:21 #23
villu, если делать, как думает редактор, то после открывающей последовательности /* нужно ждать закрывающую */, а после закрывающей - снова открывающую. Никаких вложений. По-этому в ситуации с

/**/*/**/

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

Добавлено через 1 минуту
так же вот ещё пример:

/*/*/

в любом редакторе вторые два символа не рассматриваются как вторая открывающая последовательность. вместо этого, последние два символа рассматриваются как закрывающая. с вложениями всё иначе - после одного открывающего может стоять другой
villu
203 / 203 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
15.09.2011, 14:22 #24
1: редактор открой.
2: например студия действительно не понимает комменты вложенные, а некоторые понимают.
а третьи два не рассматриваются как закрывающий коммент, потому что после закрытия ожидается открытие.
Вы говорите глупости (с)
ЛЮБОЙ редактор с такой чепухой справляется. Выше уже кинул картинку. Вот еще одна.
Изображения
 
villu
203 / 203 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
15.09.2011, 14:24 #25
Цитата Сообщение от talis Посмотреть сообщение
[b]
/*/*/
и опять ой!. потмоу что ЛЮБОЙ редактор рассмотрит / внутри /**/ как коммент.

еще картинку прислать?
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
15.09.2011, 14:26 #26
Цитата Сообщение от villu Посмотреть сообщение
Вы говорите глупости (с)
ЛЮБОЙ редактор с такой чепухой справляется
Не любой:

Удалить комментарии из строки

Code::Blocks 10.05. Ниже видно, что gcc ругается.
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
15.09.2011, 14:28 #27
Цитата Сообщение от villu Посмотреть сообщение
и опять ой!. потмоу что ЛЮБОЙ редактор рассмотрит / внутри /**/ как коммент.
и опять ой:

Название: 1.JPG
Просмотров: 34

Размер: 1.9 Кб
villu
203 / 203 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
15.09.2011, 14:30 #28
потому что студия не? а я написал что оно не умеет.

Добавлено через 51 секунду
а там ровно такая ситуация, как я и описал.

потмоу что ЛЮБОЙ редактор рассмотрит / внутри /**/ как коммент.
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
15.09.2011, 14:41 #29
Цитата Сообщение от villu Посмотреть сообщение
потмоу что ЛЮБОЙ редактор рассмотрит / внутри /**/ как коммент.
ну правильно, потому что вложенных комментов не может быть. а у нас-то ситуация совсем другая
villu
203 / 203 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
15.09.2011, 15:00 #30
ну правильно, потому что вложенных комментов не может быть. а у нас-то ситуация совсем другая
ууф..ладно.

вот еще одна проверка
1234/**sdfa /*inside*/asdfa **/56789

123456789 вывод так? однозначные вложенные комменты, все просто.
Твой код выдает 1234*inside*/asdfa ***/56789
мой 123456789
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.09.2011, 15:00
Привет! Вот еще темы с ответами:

Удалить комментарии из файла. Помогите найти ошибку. - C++
программа должна распознать комменитарии вида /* */ и // из входного файла, и записать в выходной файл программу без комментариев... 1...

С помощью итераторов удалить комментарии из текста программы - C++
Здравствуйте помогите пожалуйста решить задачу Напишите программу, которая выбрасывает комментарии из C++ программы. То есть, читает из...

Комментарии к программе на строки - C++
#include &lt;iostream&gt; #include &lt;sstream&gt; #include &lt;string&gt; using namespace std; int main() { string...

Заменить комментарии нечетной строки комментариями четной - C++
Исходный текст должен содержаться в одном файле, результат — во втором файле. В программе на ассемблере заменить комментарии нечетной...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
15.09.2011, 15:00
Ответ Создать тему
Опции темы

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