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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
trans967
6 / 2 / 1
Регистрация: 23.04.2013
Сообщений: 186
#1

Нахождение двухстрочных комментариев - C++

06.01.2014, 13:03. Просмотров 1175. Ответов 50
Метки нет (Все метки)

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
#include<iostream>
#include<string>
using namespace std;
int main()
{
    char str[100];
    cout<<"fragment koda please"<<endl;
    cin.getline(str,99);
    char* cbegin=strstr(str, "/*");
    if(cbegin!=NULL)
    {
        char* cend=strstr(cbegin+2, "*/");
        while(cbegin!=NULL)
        {
            if (cend==NULL)
            {
                for(char* pc=cbegin+2;pc!=str+strlen(str);pc++)
                    cout<<*pc;
                cout<<endl;
                break;
            }
            for(char* pc=cbegin+2;pc!=cend;pc++)
                cout<<*pc;
            cout<<endl;
            cbegin=strstr(cend+2, "/*");
            cend=strstr(cend+2, "*/");
        }
    }
    system("pause");
    return 0;
}
а вот как добавить сюда нахождение ещё и двухстрочных комментов?
т.е. //* *//

заранее благодарен.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.01.2014, 13:03
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Нахождение двухстрочных комментариев (C++):

Решение: Удаление комментариев // и /* */ - C++
может кому пригодится#include &lt;cwchar&gt; #include &lt;ostream&gt; #include &lt;istream&gt; #include &lt;iostream&gt; namespace nocomment { ...

Удаление комментариев из файла - C++
Решил написать программу которая удаляет комментарии из файла и пишет текст в другой файл, но она вдруг запинается на некоторых...

Поиск и удаление комментариев из файла - C++
Добрый вечер. Язык С++ изучаю недавно, помогите, пожалуйста, написать программу. Задача программы: найти комментарии в файле после // или...

Удаление комментариев из листинга программы - C++
Создать программу, которая будет удалять из листинга программы на языке с++ (файл*.cpp) коментарии вида // коментарий. Для работы с...

Цвет комментариев в CODE::BLOCKS - C++
Подскажите кто пользуется этой IDE и знает как изменить цвет комментариев: // Поянение, а то у меня монитор яркий и приходиться глаза...

Поменять нахождение min среди двумерного массива, на нахождение min в каждой сточке - C++
Поменять нахождение min среди двумерного массива, на нахождение min в каждой сточке #include &lt;iostream&gt; #include &lt;cstddef&gt; #include...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
trans967
6 / 2 / 1
Регистрация: 23.04.2013
Сообщений: 186
06.01.2014, 19:53  [ТС] #16
так а в чём для вас сложность дописать(как я понял) пару строчек кода в мою программу?
Вы же гуру С++, помогите,а
0
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
06.01.2014, 19:54 #17
Цитата Сообщение от trans967 Посмотреть сообщение
так а в чём для вас сложность дописать(как я понял) пару строчек кода в мою программу?
Вы же гуру С++, помогите,а
Да я призабыл эти функции, ну ок щас попробую уговорил!
0
trans967
6 / 2 / 1
Регистрация: 23.04.2013
Сообщений: 186
06.01.2014, 20:04  [ТС] #18
большое спасибо, если получится - буду очень-очень благодарен
0
0x10
2464 / 1636 / 238
Регистрация: 24.11.2012
Сообщений: 4,029
06.01.2014, 20:21 #19
Плохо писать такие портянки, но для первого курса сойдет (или где такие задания дают).
В качестве входных данных - этот же самый файл.
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
/*\
|*| Этот комментарий добавлен исключительно для демонстрации работы на таких
|*| извращенных входных данных.
|*|
|*| (C) 2014
\*/
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main()
{
    char* code_line = NULL;
    size_t n = 0;
 
    int in_comment = 0; /* true если в процессе поиска конца комментария */
 
    const char* const comment_open_tag = "/""*";
    const char* const comment_close_tag = "*""/";
 
    const char* comment_begin;
    const char* comment_end;
 
    /* Задача чисто сишная, будем пользоваться сишными функциями */
    while (getline(&code_line, &n, stdin) != -1)
    {
        if (!in_comment)
        {
            /* Попытаемся найти начало комментария в текущей строке */
            comment_begin = strstr(code_line, comment_open_tag);
 
            /*
             * Если нашли, возможны варианты:
             * 1. Комментарий заканчивается в этой же строке.
             * 2. Комментарий заканчивается в другой строке
             */
            if (comment_begin)
            {
                comment_end = strstr(comment_begin, comment_close_tag);
 
                /* Нашли конец комментария в этой же строке */
                if (comment_end)
                {
                    /* хитрый синтаксис для вывода части строки */
                    printf("%.*s\n", (int)(comment_end - comment_begin + 2),
                        comment_begin);
                }
                else
                {
                    printf("%s", code_line);
                    /* иначе запомним, что нужно найти конец комментария */
                    in_comment = 1;
                }
            }
        }
        else
        {
            comment_end = strstr(comment_begin, comment_close_tag);
            if (comment_end)
            {
                printf("%.*s\n", (int)(comment_end - code_line + 2), code_line);
                in_comment = 0;
            }
            else
            {
                printf("%s", code_line);
            }
        }
    }
 
    free(code_line);
 
    return 0;
}
Пример:
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ ./a.out < main.c 
/*\
|*| Этот комментарий добавлен исключительно для демонстрации работы на таких
|*| извращенных входных данных.
|*|
|*| (C) 2014
\*/
/* true если в процессе поиска конца комментария */
/* Задача чисто сишная, будем пользоваться сишными функциями */
/* Попытаемся найти начало комментария в текущей строке */
            /*
             * Если нашли, возможны варианты:
             * 1. Комментарий заканчивается в этой же строке.
             * 2. Комментарий заканчивается в другой строке
             */
/* Нашли конец комментария в этой же строке */
/* хитрый синтаксис для вывода части строки */
/* иначе запомним, что нужно найти конец комментария */
1
trans967
6 / 2 / 1
Регистрация: 23.04.2013
Сообщений: 186
06.01.2014, 20:41  [ТС] #20
3 курс, КПИЯП
0
0x10
06.01.2014, 20:42
  #21

Не по теме:

Цитата Сообщение от trans967 Посмотреть сообщение
3 курс
Грустно.

0
trans967
6 / 2 / 1
Регистрация: 23.04.2013
Сообщений: 186
06.01.2014, 20:48  [ТС] #22
сохранил - ошибка:
[Linker Error] Unresolved external '_getline' referenced from...

как исправить,скажите пожалуйста
0
0x10
2464 / 1636 / 238
Регистрация: 24.11.2012
Сообщений: 4,029
06.01.2014, 20:50 #23
Всегда думал, что функция стандартная. Какой компилятор так чудит?
0
trans967
6 / 2 / 1
Регистрация: 23.04.2013
Сообщений: 186
06.01.2014, 20:51  [ТС] #24
С++ Builder 6

при воспроизведении программы.
0
0x10
2464 / 1636 / 238
Регистрация: 24.11.2012
Сообщений: 4,029
06.01.2014, 20:52 #25
Ок, вру, оно гнутое.
0
trans967
6 / 2 / 1
Регистрация: 23.04.2013
Сообщений: 186
06.01.2014, 20:58  [ТС] #26
Цитата Сообщение от 0x10 Посмотреть сообщение
Ок, вру, оно гнутое.
а что теперь делать?
0
0x10
2464 / 1636 / 238
Регистрация: 24.11.2012
Сообщений: 4,029
06.01.2014, 20:58 #27
Во-первых, в первом же посте есть пример работы с std::cin.getline() - что мешает подправить код с его использованием? Уже по готовому.
Во-вторых, пусть и не в этом дело, но почему все так упорно используют шестой билдер? Я гоню или ему уже больше 10 лет?
В-третьих, ок, пофиг, раз такое дело, переезжаем частично на плюсы.
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
/*\
|*| Этот комментарий добавлен исключительно для демонстрации работы на таких
|*| извращенных входных данных.
|*|
|*| (C) 2014
\*/
 
#include <cstdio>
#include <cstdlib>
#include <cstring>
 
#include <iostream>
 
int main()
{
    const int line_len = 512;
    char code_line[line_len];
 
    int in_comment = 0; /* true если в процессе поиска конца комментария */
 
    const char* const comment_open_tag = "/""*";
    const char* const comment_close_tag = "*""/";
 
    const char* comment_begin;
    const char* comment_end;
 
    /* Задача чисто сишная, будем пользоваться сишными функциями */
    while (std::cin.getline(code_line, line_len))
    {
        if (!in_comment)
        {
            /* Попытаемся найти начало комментария в текущей строке */
            comment_begin = strstr(code_line, comment_open_tag);
 
            /*
             * Если нашли, возможны варианты:
             * 1. Комментарий заканчивается в этой же строке.
             * 2. Комментарий заканчивается в другой строке
             */
            if (comment_begin)
            {
                comment_end = strstr(comment_begin, comment_close_tag);
 
                /* Нашли конец комментария в этой же строке */
                if (comment_end)
                {
                    /* хитрый синтаксис для вывода части строки */
                    printf("%.*s\n", (int)(comment_end - comment_begin + 2),
                        comment_begin);
                }
                else
                {
                    printf("%s\n", code_line);
                    /* иначе запомним, что нужно найти конец комментария */
                    in_comment = 1;
                }
            }
        }
        else
        {
            comment_end = strstr(comment_begin, comment_close_tag);
            if (comment_end)
            {
                printf("%.*s\n", (int)(comment_end - code_line + 2), code_line);
                in_comment = 0;
            }
            else
            {
                printf("%s\n", code_line);
            }
        }
    }
 
    return 0;
}
1
ninja2
231 / 187 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
06.01.2014, 21:04 #28
trans967, А я пытался не получилось, адрес указателя увеличиваю на 1, а он как был старый так и остался. Ну ладно короче тебе уже помогли и без меня.
0
0x10
06.01.2014, 21:05
  #29

Не по теме:

ninja2, да ладно, такие задачи не для гуру.

2
trans967
6 / 2 / 1
Регистрация: 23.04.2013
Сообщений: 186
06.01.2014, 21:10  [ТС] #30
а у меня много всяких ошибок выдаёт [C++ Error]
типа нельзя printf использовать,а так же [C++ Warning]
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.01.2014, 21:10
Привет! Вот еще темы с ответами:

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

Удаление из текста программы комментариев с использованием списков - C++
Здравствуйте, уважаемые программисты! Я в С++ только недавно, в программировании совсем ничего еще не смыслю, поэтому обращаюсь к Вам за...

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

Си++, помещение комментариев из кода страницы в отдельный файл - C++
Добрый вечер! Мне необходимо комментарии из кода программы поместить в отдельный файл. Программа работает, но не совсем правильно. Вместе с...


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

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

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