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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.91
slg
Сообщений: n/a
#1

Удалить из строки комментарии вида '/* . */". Игнорировать вложенные комментарии - C++

04.02.2014, 10:35. Просмотров 1720. Ответов 4
Метки нет (Все метки)

Всем привет!
есть строка вида :
C++
1
char str[100]="abc/*111/*def/*222*/ghi*/333*/jkl";
нужно получить
C++
1
abc /*def ghi*/ jkl
Реально ли так сделать? Искал на форуме решения, есть подобные, но именно так, не нашел(
Подскажите пожалуйста хотя бы алгоритм. А если код, то желательно на СИ. Спасибо!
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.02.2014, 10:35
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Удалить из строки комментарии вида '/* . */". Игнорировать вложенные комментарии (C++):

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

Удалить комментарии вида "/* ... */" - C++
Доброе время суток! Прошу помочь мне как запилить такое "/* и */" в условие. Дело в том что нужно удалить из строки прочитанного файла...

Удалить комментарии из строки - C++
Привет. Вообщем такая задача: Прочитать из файла строку символов. Удалить из этой строки комментарии вида "/* ... */" (вложенные...

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

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

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

4
casper007
67 / 67 / 22
Регистрация: 12.12.2013
Сообщений: 400
04.02.2014, 10:45 #2
Возможно, потребуется подправить компилятор ручками.
0
mf909
96 / 12 / 3
Регистрация: 10.01.2014
Сообщений: 30
04.02.2014, 11:39 #3
Не пойму, каким образом получается результирующая строка. Но в любом случае придется проходит по строке в цикле, при этом запоминая, в каком мы по вложенности комментарии находимся в данный момент, и в зависимости от этого копировать или не копировать символы из исходной строки в строку-результат.
1
ya_noob
_
202 / 146 / 9
Регистрация: 08.10.2011
Сообщений: 432
04.02.2014, 13:07 #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
#include <cstdio>
using namespace std;
 
void parse_text( char *&, char *& );
 
void parse_comment( char *&s, char *&r )
{
    while ( *s )
    {
        if ( *s == '/' && *( s + 1 ) == '*' )
        {
            *r++ = *s++;
            *r++ = *s++;
            parse_text( s, r );
        }
        else if ( *s == '*' && *( s + 1 ) == '/' )
        {
            s += 2;
            break;
        }
        else
            ++s;
    }
}
 
void parse_text( char *&s, char *&r )
{
    while ( *s )
    {
        if ( *s == '/' && *( s + 1 ) == '*' )
        {
            *r++ = ' ';
            parse_comment( s += 2, r );
            if ( *( r - 1 ) != ' ' )
                *r++ = ' ';
        }
        else if ( *s == '*' && *( s + 1 ) == '/' )
        {
            *r++ = *s++;
            *r++ = *s++;
            break;
        }
        else
            *r++ = *s++;
    }
}
 
int main()
{
    const int N = 100;
    char s[ N ], r[ N ] = { 0 };
    char *ps = s, *pr = r;
 
    fgets( s, N, stdin );
    parse_text( ps, pr );
    puts( r );
 
    return 0;
}
1
Evg
Эксперт CАвтор FAQ
18032 / 6264 / 427
Регистрация: 30.03.2009
Сообщений: 17,221
Записей в блоге: 28
04.02.2014, 18:55 #5
Когда-то давно нужна была такая функциональность. Исходник сохранился. Он не на 100% корректен, косячит, когда внутри кавычек попадаются тексты, выглядящие как комментарии. Вложенные комментарии, не отсекаются, т.к. в Си\Си++ они запрещены и у нас, естественно, не было кривых исходников

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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
 
static void
decomment_file (const char *file_name)
{
  FILE *fp;
  int ch, next, is_inside_comment, is_inside_quote;
 
  fp = fopen (file_name, "r");
  if (fp == NULL)
    {
      fprintf (stderr, "can not open %s (%s)\n", file_name, strerror (errno));
      exit (1);
    }
 
  is_inside_comment = 0;
  is_inside_quote = 0;
  while ((ch = fgetc (fp)) != EOF)
    {
      if (is_inside_quote)
        {
          /* С точки зрения наших нужд можно было бы вырезать
           * текст в том числе и внутри кавычек. В иделале надо делать
           * более масштабную правку, а то пропадает закрывающая кавычка */
          /* FIXME если внутри кавычек имеется \" то это НЕ закрывает кавычки,
           *       надо это учитывать. При этом есть ещё \\ */
          if (1)
            putchar (ch);
 
          if (ch == '\"')
            is_inside_quote = 0;
        }
      else if (is_inside_comment)
        {
          if (ch == '*')
            {
              next = fgetc (fp);
              if (next == '/')
                is_inside_comment = 0;
            }
        }
      else
        {
          if (ch == '\"')
            is_inside_quote = 1;
          else if (ch == '/')
            {
              next = fgetc (fp);
              if (next == '*')
                {
                  is_inside_comment = 1;
                  continue;
                }
 
              putchar (ch);
              ch = next;
            }
 
          putchar (ch);
        }
    }
}
 
int
main (int argc, char **argv)
{
  if (argc != 2)
    {
      fprintf (stderr, "Usage: %s <file_name>\n", argv[0]);
      exit (1);
    }
 
  decomment_file (argv[1]);
  return 0;
}
1
04.02.2014, 18:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.02.2014, 18:55
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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