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

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

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

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

14.09.2011, 15:19. Просмотров 4534. Ответов 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++ Прочитать программу на языке C++ и удалить все комментарии
Заменить комментарии нечетной строки комментариями четной C++
Удалить комментарии вида "/* ... */" C++
C++ Удалить комментарии из файлов С и С++
Комментарии к программе на строки C++
Удалить из строки комментарии вида '/* . */". Игнорировать вложенные комментарии C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
villu
202 / 202 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
15.09.2011, 17:20     Удалить комментарии из строки #41
не. просто отпуск через неделю.
Но в Suunto с этого начинал, ты прав

кстати когда проходил там собеседование на программера задание было в написании парсера следующего (до сих пор храню)

(К сожалению оригинал задания не сохранился, да и толку от него нет -- он на финском.)

C++
1
2
3
4
"\n[[+-{$(width)}]{$(rows)}+"
"[\\n|[$(space){$(width)}|]"
"{$(rows)}]{$(height)}\\n]"
"{$(lines)}[+-{$(width)}]{$(rows)}+\\n"
Это строка
в строке:
[] - цикл
{число} количество повторений цикла []{10}, либо единичного сивола !{10}
пример: 1{5} = 11111
[12]{5} = 1212121212
[!] = !
[!]{0} = пусто
\x0000 - символ по хекс коду (\x0F0)
\x - экранированный символ (n, t, \, итд по списку + [] {} $)
$(переменная) переменная, получаемая ран-тайм. переменные могут передаваться в [] и {}
например count = 10
sym = !
[$(sym)]{$(count)} = !!!!!!!!!!
парсер должен из всего этого безобразия собрать строку
(результат в аттаче) принимая, что
"height" = 2;
"width" = 13;
"rows" = 10;
"lines" = 5;
"space" = пробел или что другое

Но! запрещены регулярные выражения, запрещен С++, запрещены функции типа strXXX. Только голый С, функции памяти (выделить/освободить) (статические буферы так же допускаются), указатели. На решение неделя.

Если вдруг интересно -- хорошая разминка. Почему-то я думаю, что ты сможешь
Миниатюры
Удалить комментарии из строки  
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
15.09.2011, 17:33     Удалить комментарии из строки #42
villu, спасибо, задание действительно интересное. Складывается ощущение, что компания специализируется на придумывании каверзных заданий.

Вопрос:

Цитата Сообщение от villu Посмотреть сообщение
[+-{$(width)}]
Как понимать последовательность +-? Конкатенация с отрицательным значением width?

Добавлено через 1 минуту
Синтаксис - убейся... Немецкая шифровка. Ну, или финская...
villu
202 / 202 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
15.09.2011, 17:35     Удалить комментарии из строки #43
нет. + и - это простые символы. то есть при width = 13 должно быть
[+-------------]

Добавлено через 1 минуту
надо в другую тему идти, пока модератор не убил
talis
791 / 543 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
15.09.2011, 17:37     Удалить комментарии из строки #44
Цитата Сообщение от villu Посмотреть сообщение
надо в другую тему идти, пока модератор не убил
Жду другую тему или личку.
KING1994
-68 / 6 / 0
Регистрация: 18.07.2011
Сообщений: 77
15.09.2011, 18:06     Удалить комментарии из строки #45
НЕпонимаю зачем так сложно писать... вот мой код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "stdafx.h"
#include<conio.h>
#include<iostream>
#include<string>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
    FILE * f;
    string a,s1,s2;int i,j;char b[100];
    s1="/*";s2="*/";
    f = fopen ("C:\\okfile.txt", "r");
    fgets(b,100,f);
        a=b;
        i=a.find(s1);j=a.find(s2);
        a.erase(i,j-i+2);
        cout<<a<<endl;
        getch();
    return 0;
}
Добавлено через 18 минут
Пардон тот код удалял только 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
#include "stdafx.h"
#include<conio.h>
#include<iostream>
#include<string> 
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
    FILE * f;
    string a,s1,s2;int i,j;char b[100];
    s1="/*";s2="*/";
    f = fopen ("C:\\okfile.txt", "r");
    fgets(b,100,f); 
        a=b;
        do
        { 
        i=a.find(s1); 
        if(i==-1)break;
        j=a.find(s2);
        if(j==-1)break;
        a.erase(i,j-i+2);
        }while(j!=-1);
        cout<<a<<endl;
        getch();
    return 0;
}
recovery101
1 / 1 / 0
Регистрация: 10.06.2011
Сообщений: 10
16.09.2011, 11:49  [ТС]     Удалить комментарии из строки #46
В 19-ой строке помоему что-то не то. Он находит первое вхождение */ и удаляет до нее, в и тоге в выходной строке остается лишняя */.
lavan
51 / 51 / 1
Регистрация: 21.03.2009
Сообщений: 371
16.09.2011, 16:21     Удалить комментарии из строки #47
Если я правильно понял задание(не совсем понятно,что значит не создавать новую строку)
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
#include<stdio.h>
#include<stdlib.h>
int main() {
    FILE *pf;
    int size,i,start,finish;
    char *buf;
    short flag=1;
    pf=fopen("test.txt","r");
    if(pf==NULL) {
        printf("bug1");
        getch();
        return;
    }
    fseek(pf,0,SEEK_END);
    size=ftell(pf);
    fseek(pf,0,SEEK_SET);
    buf=(char*)malloc(size*sizeof(char));
    if(!buf) {
        printf("bug2\n");
        return;
    }
    fgets(buf,size+1,pf);
    for(i=0;i<size;i++) {
       //char ch=fgetc(pf);//так если нельзя создавать буфер
       if(buf[i]=='/' && flag) {//******
           //ch=fgetc(pf);
           if(buf[i+1]=='*') {
               start=i;
               flag=0;
           }
       }//*******
       else if(buf[i]=='*') {
           if(buf[i+1]=='/')
           finish=i+1;
       }
    }
    puts(buf);
    for(i=0;i<size;i++) {
        if((i>=start)&&(i<=finish))continue;
        printf("%c",buf[i]);
    }
    free(buf);
    fclose(pf);
    getch();
    return 0;
}
думаю перевести на С++ не проблема
igorrr37
1636 / 1264 / 129
Регистрация: 21.12.2010
Сообщений: 1,927
Записей в блоге: 7
16.09.2011, 18:38     Удалить комментарии из строки #48
без файла правда
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <string>
 
int main(){
    std::string s = "suc/*gh /*hj*/uy*/ces/**/s";
    std::string::size_type beg, end;
    while((beg = s.rfind("/*")) != std::string::npos && (end = s.find("*/", beg)) != std::string::npos){
        s.erase(beg, end-beg+2);
        //std::cout << "beg= " << beg <<"\nend= "<<end<<"\ns= "<<s<<"\n\n";
    }
    std::cout << s << std::endl;
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.09.2011, 19:53     Удалить комментарии из строки
Еще ссылки по теме:

Удалить строки динамической матрицы, начиная со строки К1 и до строки К2 C++
Удалить из строки каждую пару символов '!?' и удалить некоторые символы C++
C++ Удалить комментарии из фаила
С помощью итераторов удалить комментарии из текста программы C++
C++ Удалить из строки слова, которые встречаются заданное число раз (нужны комментарии)

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

Или воспользуйтесь поиском по форуму:
KING1994
-68 / 6 / 0
Регистрация: 18.07.2011
Сообщений: 77
16.09.2011, 19:53     Удалить комментарии из строки #49
recovery101,я не знаю што у вас не удаляет но у меня все работает отлично
Yandex
Объявления
16.09.2011, 19:53     Удалить комментарии из строки
Ответ Создать тему
Опции темы

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