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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.71
intnower
0 / 0 / 0
Регистрация: 12.01.2012
Сообщений: 68
02.04.2012, 16:05     заменить все комментарии, заданные в круглых скобках, на одиночный пробел. #1
Привет всем!
нужна помощь в написании программы!
Я вот не пойму кое-чего.. Нужно найти сначала в массиве строки "(" запомнить позицию этой скобки в массиве, а потом записывать всё в новый массив до символа ")" и уже в новом массиве произвести этот самый пробел? а потом уже всунуть в основной массив строки с заменой?

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++
C++ Вывести все правильные скобочные выражения длиной N, состоящие из круглых и квадратных скобок
Заменить в строке последовательность пробелов на один пробел. C++
C++ Дан текстовый файл. Заменить в нем все подряд идущие пробелы на один пробел.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Avazart
 Аватар для Avazart
6906 / 5146 / 253
Регистрация: 10.12.2010
Сообщений: 22,639
Записей в блоге: 17
02.04.2012, 16:12     заменить все комментарии, заданные в круглых скобках, на одиночный пробел. #2
Используй std::string в качестве строк вместо char[]
intnower
0 / 0 / 0
Регистрация: 12.01.2012
Сообщений: 68
02.04.2012, 21:55  [ТС]     заменить все комментарии, заданные в круглых скобках, на одиночный пробел. #3
Цитата Сообщение от Avazart Посмотреть сообщение
Используй std::string в качестве строк вместо char[]
а для чего нужен std::string?
это, что скопировать строки можно было нормально?
Avazart
 Аватар для Avazart
6906 / 5146 / 253
Регистрация: 10.12.2010
Сообщений: 22,639
Записей в блоге: 17
02.04.2012, 22:11     заменить все комментарии, заданные в круглых скобках, на одиночный пробел. #4
Это контейнер им удобнее(и безопаснее) пользоваться, у него куча методов + можно пользоваться стандартными алгоритмами типа копирования, сортировки,удаления... в общем STL
intnower
0 / 0 / 0
Регистрация: 12.01.2012
Сообщений: 68
02.04.2012, 22:16  [ТС]     заменить все комментарии, заданные в круглых скобках, на одиночный пробел. #5
блин, дело в том, что Я незнаком со стандартной библиотекой шаблонов ):
мне нужно написать программу с использованием стандартных алгоритмов с++
помогите, пожалуйста!
Avazart
 Аватар для Avazart
6906 / 5146 / 253
Регистрация: 10.12.2010
Сообщений: 22,639
Записей в блоге: 17
02.04.2012, 22:30     заменить все комментарии, заданные в круглых скобках, на одиночный пробел. #6
Тогда читай это (в действительности STL и есть стандартная для С++, а те нужна работа со строками C);
http://www.rsdn.ru/article/cpp/cstr.xml
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
02.04.2012, 22:34     заменить все комментарии, заданные в круглых скобках, на одиночный пробел. #7
intnower, что должно получиться для строки вида (a))?
intnower
0 / 0 / 0
Регистрация: 12.01.2012
Сообщений: 68
02.04.2012, 22:38  [ТС]     заменить все комментарии, заданные в круглых скобках, на одиночный пробел. #8
Цитата Сообщение от soon Посмотреть сообщение
intnower, что должно получиться для строки вида (a))?
по-идее ( )
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
02.04.2012, 22:42     заменить все комментарии, заданные в круглых скобках, на одиночный пробел. #9
Т.е. найти первую (, найти последнюю ) и заменить все то, что между ними?
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,061
02.04.2012, 22:42     заменить все комментарии, заданные в круглых скобках, на одиночный пробел. #10
Цитата Сообщение от intnower Посмотреть сообщение
if(str[i]=='(')
i=a;
что ты этим хотел сделать???
Цитата Сообщение от intnower Посмотреть сообщение
for(i=a+1;str[i]!=')';i++)
а если не будет закрывающей скобки куда упадем???
попробуй использовать стек
после '(' все запихиваем в стек
после ')' достаем из стека и меняем значение на пробел
ну и конечно обработчик конца строки
если есть вылетаем с ошибкой или пишем " не корректная строка"
intnower
0 / 0 / 0
Регистрация: 12.01.2012
Сообщений: 68
02.04.2012, 22:46  [ТС]     заменить все комментарии, заданные в круглых скобках, на одиночный пробел. #11
Цитата Сообщение от soon Посмотреть сообщение
Т.е. найти первую (, найти последнюю ) и заменить все то, что между ними?
да, именно (:

Добавлено через 1 минуту
Цитата Сообщение от ValeryS Посмотреть сообщение
что ты этим хотел сделать???

а если не будет закрывающей скобки куда упадем???
попробуй использовать стек
после '(' все запихиваем в стек
после ')' достаем из стека и меняем значение на пробел
ну и конечно обработчик конца строки
если есть вылетаем с ошибкой или пишем " не корректная строка"
Я, конечно, может быть, и сделал бы так, но не знаком со стеком ):
Я пробовал всё это сделать через массив строк, но что-то безуспешно..

C++
1
2
if(str[i]=='(')
            i=a;
этим Я нашел позицию этой самой скобки, чтобы в последующем использовать в цикле..
C++
1
for(i=a+1;str[i]!=')';i++)
получилось, что Я перебираю все элементы, которые находятся в скобках.. А вот можно ли их как-нибудь заменить на пробел?
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
02.04.2012, 22:52     заменить все комментарии, заданные в круглых скобках, на одиночный пробел. #12
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <string>
#include <cstdlib>
 
int main()
{
    std::string str("(a))");
    std::size_t first = str.find("("), last = str.rfind(")");
    if(first != std::string::npos && last != std::string::npos && first < last)
    {
        str.replace(first + 1, last - 1, " ");
        std::cout << str << std::endl;
    }
    else
        std::cout << "error" << std::endl;
    return 0;
}
intnower
0 / 0 / 0
Регистрация: 12.01.2012
Сообщений: 68
02.04.2012, 22:56  [ТС]     заменить все комментарии, заданные в круглых скобках, на одиночный пробел. #13
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <string>
#include <cstdlib>
 
int main()
{
    std::string str("(a))");
    std::size_t first = str.find("("), last = str.rfind(")");
    if(first != std::string::npos && last != std::string::npos && first < last)
    {
        str.replace(first + 1, last - 1, " ");
        std::cout << str << std::endl;
    }
    else
        std::cout << "error" << std::endl;
    return 0;
}
а если нужно будет заменять в текстовом файле, Я так понимаю, этот код уже не проканает? (:
Avazart
 Аватар для Avazart
6906 / 5146 / 253
Регистрация: 10.12.2010
Сообщений: 22,639
Записей в блоге: 17
02.04.2012, 23:01     заменить все комментарии, заданные в круглых скобках, на одиночный пробел. #14
Кажется не подойдет для строки с несколькими комментариями "бла1 ( комент1 ) бла2 ( комент2 )" вырежет бла2
intnower
0 / 0 / 0
Регистрация: 12.01.2012
Сообщений: 68
02.04.2012, 23:03  [ТС]     заменить все комментарии, заданные в круглых скобках, на одиночный пробел. #15
а что значит str.find и str.rfind
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
02.04.2012, 23:03     заменить все комментарии, заданные в круглых скобках, на одиночный пробел. #16
Avazart, ТС сам попросил найти первый и последний, а затем вырезать все что между ними.

Цитата Сообщение от intnower Посмотреть сообщение
а если нужно будет заменять в текстовом файле, Я так понимаю, этот код уже не проканает? (:
Считываете в переменную, меняете, записываете в файл
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,061
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 минуту
написал и заметил мой алгоритм не отработает ()
soon
 Аватар для soon
2536 / 1301 / 81
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
02.04.2012, 23:10     заменить все комментарии, заданные в круглых скобках, на одиночный пробел. #18
Цитата Сообщение от intnower Посмотреть сообщение
а что значит str.find и str.rfind
Искать с начала и с конца строки соответственно.
Avazart
 Аватар для Avazart
6906 / 5146 / 253
Регистрация: 10.12.2010
Сообщений: 22,639
Записей в блоге: 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;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.04.2012, 23:24     заменить все комментарии, заданные в круглых скобках, на одиночный пробел.
Еще ссылки по теме:

C++ Удалить в строке символов все символы в скобках вместе с самими скобками
C++ Удалить часть текста в круглых скобках
Замена двойных пробелов из входного файла на одиночный пробел и запись в выходной файл (объяснить работу кода) C++

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

Или воспользуйтесь поиском по форуму:
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++) по-раньше использовать? до превращения в пробел?
Yandex
Объявления
02.04.2012, 23:24     заменить все комментарии, заданные в круглых скобках, на одиночный пробел.
Ответ Создать тему
Опции темы

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