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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.91
slg
Сообщений: n/a
04.02.2014, 10:35     Удалить из строки комментарии вида '/* . */". Игнорировать вложенные комментарии #1
Всем привет!
есть строка вида :
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++ Прочитать программу на языке C++ и удалить все комментарии
C++ Удалить комментарии из строки
Удалить комментарии вида "/* ... */" C++
C++ Удалить комментарии из файлов С и С++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
casper007
61 / 61 / 21
Регистрация: 12.12.2013
Сообщений: 375
04.02.2014, 10:45     Удалить из строки комментарии вида '/* . */". Игнорировать вложенные комментарии #2
Возможно, потребуется подправить компилятор ручками.
mf909
96 / 12 / 3
Регистрация: 10.01.2014
Сообщений: 29
04.02.2014, 11:39     Удалить из строки комментарии вида '/* . */". Игнорировать вложенные комментарии #3
Не пойму, каким образом получается результирующая строка. Но в любом случае придется проходит по строке в цикле, при этом запоминая, в каком мы по вложенности комментарии находимся в данный момент, и в зависимости от этого копировать или не копировать символы из исходной строки в строку-результат.
ya_noob
_
200 / 144 / 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;
}
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16843 / 5264 / 323
Регистрация: 30.03.2009
Сообщений: 14,159
Записей в блоге: 26
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;
}
Yandex
Объявления
04.02.2014, 18:55     Удалить из строки комментарии вида '/* . */". Игнорировать вложенные комментарии
Ответ Создать тему
Опции темы

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