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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 36, средняя оценка - 4.86
recovery101
1 / 1 / 0
Регистрация: 10.06.2011
Сообщений: 10
14.09.2011, 15:19     Удалить комментарии из строки #1
Привет. Вообщем такая задача: Прочитать из файла строку символов. Удалить из этой строки комментарии вида "/* ... */" (вложенные комментарии тоже удалить) . Новую строку не создавать. Вывести исходную и преобразованную строки.
Т.е. например: дана строка "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".
Помогите пожалуйста исправить.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
 Аватар для talis
789 / 541 / 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
 Аватар для talis
789 / 541 / 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
 Аватар для igorrr37
1593 / 1221 / 118
Регистрация: 21.12.2010
Сообщений: 1,868
Записей в блоге: 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     Удалить комментарии из строки
Еще ссылки по теме:

Удалить из строки комментарии вида '/* . */". Игнорировать вложенные комментарии C++
C++ Удалить комментарии из фаила
С помощью итераторов удалить комментарии из текста программы C++

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

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

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