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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.71
intnower
0 / 0 / 0
Регистрация: 12.01.2012
Сообщений: 68
#1

заменить все комментарии, заданные в круглых скобках, на одиночный пробел. - C++

02.04.2012, 16:05. Просмотров 1775. Ответов 33
Метки нет (Все метки)

Привет всем!
нужна помощь в написании программы!
Я вот не пойму кое-чего.. Нужно найти сначала в массиве строки "(" запомнить позицию этой скобки в массиве, а потом записывать всё в новый массив до символа ")" и уже в новом массиве произвести этот самый пробел? а потом уже всунуть в основной массив строки с заменой?

C++
1
2
3
4
5
for(i=0;str[i]!='\0';++i)
    {
        if(str[i]=='(')
            i=a;
    for(i=a+1;str[i]!=')';i++)
тут Я перебрал все элементы, которые находятся в скобках, а как их теперь удалить или заменить пробелом?
пробовал копировать с помощью strcpy все элементы до и после скобок, и выводится чушь какая-то ):
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.04.2012, 16:05     заменить все комментарии, заданные в круглых скобках, на одиночный пробел.
Посмотрите здесь:

Заменить символ табуляции на пробел. C++
C++ Вывести все правильные скобочные выражения длиной N, состоящие из круглых и квадратных скобок
Заменить в строке последовательность пробелов на один пробел. C++
C++ Дан текстовый файл. Заменить в нем все подряд идущие пробелы на один пробел.
C++ Удалить часть текста в круглых скобках
Замена двойных пробелов из входного файла на одиночный пробел и запись в выходной файл (объяснить работу кода) C++
Замена символов в скобках на пробел C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Avazart
7063 / 5240 / 262
Регистрация: 10.12.2010
Сообщений: 23,049
Записей в блоге: 17
02.04.2012, 23:32     заменить все комментарии, заданные в круглых скобках, на одиночный пробел. #21
C++
1
2
3
4
char str[]="бла1(комент1)бла2(комент2)";
char *result= new char[strlen(str)];
memset(result,' ',strlen(str));//добавил
//...
intnower
0 / 0 / 0
Регистрация: 12.01.2012
Сообщений: 68
02.04.2012, 23:33  [ТС]     заменить все комментарии, заданные в круглых скобках, на одиночный пробел. #22
Считываете в переменную, меняете, записываете в файл
а вот если надо, чтобы из созданного файла производилась считка текста и уже потом замена на пробелы?
ValeryS
Модератор
6511 / 4977 / 460
Регистрация: 14.02.2011
Сообщений: 16,484
02.04.2012, 23:35     заменить все комментарии, заданные в круглых скобках, на одиночный пробел. #23
Цитата Сообщение от intnower Посмотреть сообщение
for(;str[i]!=')';i++) // запускаем снова цикл перебора элементов только уже до символа ")"?
ну да и не копируем строку

Цитата Сообщение от intnower Посмотреть сообщение
if(str[i]==0) return error; // и если до этой ")" встретиться 0, то ошибка?
ну да конец строки закрывающая не встретилась ощибка
0 в данном случае равен '\0'
Цитата Сообщение от intnower Посмотреть сообщение
а там же вроде как надо for(;str[i]!=')';i++) по-раньше использовать? до превращения в пробел?
в пробел мы превратили в этих строках
Цитата Сообщение от intnower Посмотреть сообщение
i++;
str[i]=' ';
миль пардон косяк
конечно же str1[i]=' ';
soon
2537 / 1302 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
02.04.2012, 23:38     заменить все комментарии, заданные в круглых скобках, на одиночный пробел. #24
Цитата Сообщение от intnower Посмотреть сообщение
а вот если надо, чтобы из созданного файла производилась считка текста и уже потом замена на пробелы?
А я про что?
ValeryS
Модератор
6511 / 4977 / 460
Регистрация: 14.02.2011
Сообщений: 16,484
03.04.2012, 00:09     заменить все комментарии, заданные в круглых скобках, на одиночный пробел. #25
а еще косяк заметил после ) i будет очинь другой
надо примерно так
C++
1
2
3
 for(int a=i;str[i+a]!=')';a++)
               if(str[i+a]==0)
                       return error;
i не трогаем для продолжения копирования строки

Добавлено через 27 минут
заинтриговали вы меня
со всеми исправлениями
C++
1
2
3
4
5
6
7
8
9
10
11
int i,a=0;
for(i=0;str[i+a]!='\0';++i)
 {
    str1[i]=str[i+a];
    if(str[i]=='(')
       { i++;
          str1[i]=' ';
          for(a=i+a;str[i+a]!=')';a++)
                    if(str[i+a]==0)
                       return error;
        }
не знаю понятно без коментов или нет
и не могу проверить на такой примеру строке ффф(ии)ппп(ккк) вар(лол)
компилятора нет
но вроде все правильно
главное смешение a чтобы правильно учитывалось
Avazart
7063 / 5240 / 262
Регистрация: 10.12.2010
Сообщений: 23,049
Записей в блоге: 17
03.04.2012, 00:21     заменить все комментарии, заданные в круглых скобках, на одиночный пробел. #26
Замутно как-то...

Добавлено через 50 секунд
компилятора нет
Для этого есть онлайн компиляторы...
intnower
0 / 0 / 0
Регистрация: 12.01.2012
Сообщений: 68
03.04.2012, 00:24  [ТС]     заменить все комментарии, заданные в круглых скобках, на одиночный пробел. #27
ValeryS
к сожалению не работает
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
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <Windows.h>
using namespace std;
void main ()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
int i;
int b=0;
char str[1024];
char str1[1024];
FILE *A;
A=fopen("C:\\A.txt","r");
{
fgets(str,1024,A);
cout<<str;
}
cout<<'\n';
for(i=0;str[i+b]!='\0';++i)
    {
     str1[i]=str[i+b];
    }
if(str[i]=='(')
    { i++;
          str1[i]=' ';
          for(b=i+b;str[i+b]!=')';b++)
                    if(str[i+b]=='\0')
cout<<"ERROR";
    }
cout<<str[i];
system ("PAUSE");
    }
вот он код, с которого проверяю.
в файле А.txt располагается следующий текст: razdvatrihelloPrivet(goodday)loh
просто убирает все слова.. остаются сплошные пробелы ):
ValeryS
Модератор
6511 / 4977 / 460
Регистрация: 14.02.2011
Сообщений: 16,484
03.04.2012, 00:26     заменить все комментарии, заданные в круглых скобках, на одиночный пробел. #28
Цитата Сообщение от Avazart Посмотреть сообщение
Замутно как-то...
ага!
а у тебя все понятно
Цитата Сообщение от Avazart Посмотреть сообщение
char str[]="бла1(комент1)бла2(комент2)";
char *result= new char[strlen(str)];
memset(result,' ',strlen(str));//добавил
если учесть что
Функция memset заполняет буфер указанным символом.
вся строка в пробелах
Avazart
7063 / 5240 / 262
Регистрация: 10.12.2010
Сообщений: 23,049
Записей в блоге: 17
03.04.2012, 00:38     заменить все комментарии, заданные в круглых скобках, на одиночный пробел. #29
а у тебя все понятно
Да как-то по проще
вся строка в пробелах
Иначе все равно не угадаешь размер, как вариант добавлять в конце обхода '\0'.
ValeryS
Модератор
6511 / 4977 / 460
Регистрация: 14.02.2011
Сообщений: 16,484
03.04.2012, 05:41     заменить все комментарии, заданные в круглых скобках, на одиночный пробел. #30
Цитата Сообщение от Avazart Посмотреть сообщение
Иначе все равно не угадаешь размер, .
задача то не выполнена
у тебя будет вместо "(1234)"будет "( ) " а нужно "( )"
так что только
Цитата Сообщение от Avazart Посмотреть сообщение
добавлять в конце обхода '\0'.
Добавлено через 4 минуты
Цитата Сообщение от Avazart Посмотреть сообщение
Да как-то по проще
вообще то одинакого у тебя две переменных цикла одна постоянно добавляется вторая по условию
у меня смешение по условию грубо говоря говоря мои i+a равны твоему j
и твоя и моя решит с ошибкой если будут вложенные скобки

Добавлено через 7 минут
Цитата Сообщение от intnower Посмотреть сообщение
for(i=0;str[i+b]!='\0';++i)
{
str1[i]=str[i+b];
}
а зачем ты всю строку скопировал???
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
for(i=0;str[i+b]!='\0';++i)
 {
 str1[i]=str[i+b];
    if(str[i]=='(')
       { i++;
          str1[i]=' ';
           for(;str[i+b]!=')';b++)
              if(str[i+b]=='\0')
                   cout<<"ERROR";
        }
}
str1[i]='\0';
cout<<str1;
intnower
0 / 0 / 0
Регистрация: 12.01.2012
Сообщений: 68
03.04.2012, 23:43  [ТС]     заменить все комментарии, заданные в круглых скобках, на одиночный пробел. #31
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
for(i=0;str[i+b]!='\0';++i)
 {
 str1[i]=str[i+b];
    if(str[i]=='(')
       { i++;
          str1[i]=' ';
           for(;str[i+b]!=')';b++)
              if(str[i+b]=='\0')
                   cout<<"ERROR";
        }
}
str1[i]='\0';
cout<<str1;
этот код почти работает (:
но из введенного odindvatri chetire (pyat) shest
выводит odindvatri chetire ( shest
ковырялся-ковырялся, так и не понял почему ):

Добавлено через 4 часа 20 минут
почему вот убирается скобка ")" не понятно, там же в цикле str[i+b]!=')'
intnower
0 / 0 / 0
Регистрация: 12.01.2012
Сообщений: 68
03.04.2012, 23:44  [ТС]     заменить все комментарии, заданные в круглых скобках, на одиночный пробел. #32
вот, нагляднее
Миниатюры
заменить все комментарии, заданные в круглых скобках, на одиночный пробел.  
Avazart
7063 / 5240 / 262
Регистрация: 10.12.2010
Сообщений: 23,049
Записей в блоге: 17
04.04.2012, 00:29     заменить все комментарии, заданные в круглых скобках, на одиночный пробел. #33
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
int _tmain(int argc, _TCHAR* argv[])
{
system("chcp 1251");
 
char str[]="бла1(комент1)бла2(комент2)";
char *result= new char[strlen(str)];
//memset(result,' ',strlen(str));
bool comment=false;
unsigned j=0;
for(unsigned i=0;i<strlen(str);i++)
 {
 if (str[i]=='(')
     {
     comment=true;
     result[j]='(';
     result[j+1]=' ';
     result[j+2]=')';
     j+=2;
     continue;
     }
 if (str[i]==')') { comment=false;j++;continue;}
 if ( !comment ) { result[j]= str[i]; j++; }
 }
result[j]='\0';
 
if(!comment)cout<<result<<endl;
else cerr<<"Потерена закрывающая скобка"<<endl;
 
delete[] result;
system("pause");
return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
04.04.2012, 10:22     заменить все комментарии, заданные в круглых скобках, на одиночный пробел.
Еще ссылки по теме:

C++ Что означает название переменной в круглых скобках?
В матрице заменить заданные строку и столбец нулями C++
C++ Используя заданные разделители продублировать слова-палиндромы через один пробел
Каждую группу из n последовательно стоящих символов ‘’ (пробел) и '\t' (табуляция) заменить на один пробел C++
Изъять комментарии и добавить вместо них символ "пробел" C++

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

Или воспользуйтесь поиском по форуму:
intnower
0 / 0 / 0
Регистрация: 12.01.2012
Сообщений: 68
04.04.2012, 10:22  [ТС]     заменить все комментарии, заданные в круглых скобках, на одиночный пробел. #34
спасибо, конечно, большое (:
а можете помочь все же в этом коде разобраться?
просто его Я могу полностью объяснить, что и как. И все операторы знакомые.
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
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <Windows.h>
using namespace std;
void main ()
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
int i;
int a=0;
int b=0;
char str[1024];
char str1[1024];
FILE *A;
A=fopen("C:\\A.txt","r");
{
fgets(str,1024,A);
cout<<str;
}
cout<<'\n';
for(i=0;str[i+b]!='\0';++i)
 {
 str1[i]=str[i+b];
    if(str[i]=='(')
       { ++i;
          str1[i+b]=' ';
        
          for(;str[i+b]!=')';++b)
            if(str[i+b]=='\0')
                 cout<<"ERROR";
            }
        }
 
str1[i]='\0';
 
cout<<"Result:"<<'\n'<<str1;
cout<<'\n';
system ("PAUSE");
}
вот результат картинка
по-идее ")" должна остаться, а она удаляется ):
Yandex
Объявления
04.04.2012, 10:22     заменить все комментарии, заданные в круглых скобках, на одиночный пробел.
Ответ Создать тему
Опции темы

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