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

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

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

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

02.04.2012, 16:05. Просмотров 1922. Ответов 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 все элементы до и после скобок, и выводится чушь какая-то ):
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.04.2012, 16:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос заменить все комментарии, заданные в круглых скобках, на одиночный пробел. (C++):

Удалить часть текста в круглых скобках - C++
В заданном тексте удалить часть текста, заключенную в круглые скобки (скобки не удалять). Не поможите?

Что означает название переменной в круглых скобках? - C++
Что означает название переменной в круглых скобках? В комментариях указан тип переменной и некоторые пояснения. auto c = 0; // int ...

Замена двойных пробелов из входного файла на одиночный пробел и запись в выходной файл (объяснить работу кода) - C++
Здравствуйте, нашла код программы, которая заменяет в файле Input.txt двойные пробелы в исходном файле на одиночные пробелы и выводит это...

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

Каждую группу из n последовательно стоящих символов ‘’ (пробел) и '\t' (табуляция) заменить на один пробел - C++
Каждую группу из n последовательно стоящих символов ‘’ (пробел) и '\t' (табуляция) заменить на один пробел

В строке заменить пробел между слов на запятую и пробел - C++
В строке заменить пробел между слов на запятую и пробел

33
soon
2542 / 1307 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
02.04.2012, 23:03 #16
Avazart, ТС сам попросил найти первый и последний, а затем вырезать все что между ними.

Цитата Сообщение от intnower Посмотреть сообщение
а если нужно будет заменять в текстовом файле, Я так понимаю, этот код уже не проканает? (:
Считываете в переменную, меняете, записываете в файл
0
ValeryS
Модератор
6783 / 5191 / 496
Регистрация: 14.02.2011
Сообщений: 17,415
02.04.2012, 23:06 #17
Цитата Сообщение от intnower Посмотреть сообщение
но не знаком со стеком )
ну дак изучи
во многих алгоритмах используемый
кстати у меня там ошибочка есть
я все элементы менял на пробел
а нужно например так
открывающая запихиваем в стек в строку пробел закрывающая бросаем запихивать
можно и без стека по твоему ну примерно так
только добавить новую строку

C++
1
2
3
4
5
6
7
8
9
10
for(i=0;str[i]!='\0';++i)
 {
    str1[i]=str[i];
    if(str[i]=='(')
       { i++;
          str[i]=' ';
          for(;str[i]!=')';i++)
                    if(str[i]==0)
                       return error;
        }
примерно так
т.е пока мы находимся между скобками мы строку не копируем
если нет закрываюшей скобки выходим по ошибке

но если будет такая строка
( ыыы ( ввв) ыы)
то получим
( ыы)если есть вложеные скобки то задача не так проста

Добавлено через 1 минуту
написал и заметил мой алгоритм не отработает ()
1
soon
2542 / 1307 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
02.04.2012, 23:10 #18
Цитата Сообщение от intnower Посмотреть сообщение
а что значит str.find и str.rfind
Искать с начала и с конца строки соответственно.
1
Avazart
Эксперт С++
7458 / 5504 / 315
Регистрация: 10.12.2010
Сообщений: 24,559
Записей в блоге: 17
02.04.2012, 23:19 #19
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int _tmain(int argc, _TCHAR* argv[])
{
system("chcp 1251");
 
char str[]="бла1(комент1)бла2(комент2)";
char *result= new char[strlen(str)];
 
bool comment=false;
 
for(unsigned i=0,j=0;i<strlen(str);i++)
 {
 if (str[i]=='(') comment=true;
 if (str[i]==')') { comment=false; result[j]=' ';j++;continue;}
 
 if ( !comment ) { result[j]= str[i]; j++; }
 }
cout<<result<<endl;
 
delete[] result;
system("pause");
return 0;
}
1
intnower
0 / 0 / 0
Регистрация: 12.01.2012
Сообщений: 68
02.04.2012, 23:24  [ТС] #20
Цитата Сообщение от ValeryS Посмотреть сообщение

C++
1
2
3
4
5
6
7
8
9
10
for(i=0;str[i]!='\0';++i)
 {
    str1[i]=str[i];
    if(str[i]=='(')
       { i++;
          str[i]=' ';
          for(;str[i]!=')';i++)
                    if(str[i]==0)
                       return error;
        }
что-то не робит ):
как Я понял
for(i=0;str[i]!='\0';++i) { str1[i]=str[i]; //копирование из одного массива строк в другой?
if(str[i]=='(') { i++; //если встретился символ "(" , то перескакиваем на следующий элемент
str[i]=' '; // меняем их на пробел
а потом уже как-то странно идет..
for(;str[i]!=')';i++) // запускаем снова цикл перебора элементов только уже до символа ")"?
if(str[i]==0) return error; // и если до этой ")" встретиться 0, то ошибка?
а там же вроде как надо for(;str[i]!=')';i++) по-раньше использовать? до превращения в пробел?
0
Avazart
Эксперт С++
7458 / 5504 / 315
Регистрация: 10.12.2010
Сообщений: 24,559
Записей в блоге: 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));//добавил
//...
0
intnower
0 / 0 / 0
Регистрация: 12.01.2012
Сообщений: 68
02.04.2012, 23:33  [ТС] #22
Считываете в переменную, меняете, записываете в файл
а вот если надо, чтобы из созданного файла производилась считка текста и уже потом замена на пробелы?
0
ValeryS
Модератор
6783 / 5191 / 496
Регистрация: 14.02.2011
Сообщений: 17,415
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]=' ';
1
soon
2542 / 1307 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
02.04.2012, 23:38 #24
Цитата Сообщение от intnower Посмотреть сообщение
а вот если надо, чтобы из созданного файла производилась считка текста и уже потом замена на пробелы?
А я про что?
0
ValeryS
Модератор
6783 / 5191 / 496
Регистрация: 14.02.2011
Сообщений: 17,415
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 чтобы правильно учитывалось
1
Avazart
Эксперт С++
7458 / 5504 / 315
Регистрация: 10.12.2010
Сообщений: 24,559
Записей в блоге: 17
03.04.2012, 00:21 #26
Замутно как-то...

Добавлено через 50 секунд
компилятора нет
Для этого есть онлайн компиляторы...
0
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
просто убирает все слова.. остаются сплошные пробелы ):
0
ValeryS
Модератор
6783 / 5191 / 496
Регистрация: 14.02.2011
Сообщений: 17,415
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 заполняет буфер указанным символом.
вся строка в пробелах
0
Avazart
Эксперт С++
7458 / 5504 / 315
Регистрация: 10.12.2010
Сообщений: 24,559
Записей в блоге: 17
03.04.2012, 00:38 #29
а у тебя все понятно
Да как-то по проще
вся строка в пробелах
Иначе все равно не угадаешь размер, как вариант добавлять в конце обхода '\0'.
0
ValeryS
Модератор
6783 / 5191 / 496
Регистрация: 14.02.2011
Сообщений: 17,415
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;
1
03.04.2012, 05:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.04.2012, 05:41
Привет! Вот еще темы с ответами:

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

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

Изъять из строки комментарии (в фигурных скобках) и добавить вместо них символ "пробел" - Pascal
В языке паскаль комментарии ограничиваются фигурными дужками. Написать программу которая изымает комментарии и добавляет вместо них символ...

Что означает число в круглых скобках после INT? - MySQL
приветствую. естъ поле aaa, его тип естъ INT. что разница между етими: INT(3) и INT(8) если в поле aaa я могу записатъ и в первом и...


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Опции темы

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