Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
intnower
0 / 0 / 0
Регистрация: 12.01.2012
Сообщений: 68
1

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

02.04.2012, 16:05. Просмотров 2059. Ответов 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
Ответы с готовыми решениями:

Удалить часть текста в круглых скобках
В заданном тексте удалить часть текста, заключенную в круглые скобки (скобки не...

Что означает название переменной в круглых скобках?
Что означает название переменной в круглых скобках? В комментариях указан тип...

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

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

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

33
Avazart
Эксперт С++
7759 / 5664 / 555
Регистрация: 10.12.2010
Сообщений: 25,666
Записей в блоге: 17
02.04.2012, 16:12 2
Используй std::string в качестве строк вместо char[]
1
intnower
0 / 0 / 0
Регистрация: 12.01.2012
Сообщений: 68
02.04.2012, 21:55  [ТС] 3
Цитата Сообщение от Avazart Посмотреть сообщение
Используй std::string в качестве строк вместо char[]
а для чего нужен std::string?
это, что скопировать строки можно было нормально?
0
Avazart
Эксперт С++
7759 / 5664 / 555
Регистрация: 10.12.2010
Сообщений: 25,666
Записей в блоге: 17
02.04.2012, 22:11 4
Это контейнер им удобнее(и безопаснее) пользоваться, у него куча методов + можно пользоваться стандартными алгоритмами типа копирования, сортировки,удаления... в общем STL
1
intnower
0 / 0 / 0
Регистрация: 12.01.2012
Сообщений: 68
02.04.2012, 22:16  [ТС] 5
блин, дело в том, что Я незнаком со стандартной библиотекой шаблонов ):
мне нужно написать программу с использованием стандартных алгоритмов с++
помогите, пожалуйста!
0
Avazart
Эксперт С++
7759 / 5664 / 555
Регистрация: 10.12.2010
Сообщений: 25,666
Записей в блоге: 17
02.04.2012, 22:30 6
Тогда читай это (в действительности STL и есть стандартная для С++, а те нужна работа со строками C);
http://www.rsdn.ru/article/cpp/cstr.xml
1
soon
2546 / 1311 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
02.04.2012, 22:34 7
intnower, что должно получиться для строки вида (a))?
0
intnower
0 / 0 / 0
Регистрация: 12.01.2012
Сообщений: 68
02.04.2012, 22:38  [ТС] 8
Цитата Сообщение от soon Посмотреть сообщение
intnower, что должно получиться для строки вида (a))?
по-идее ( )
0
soon
2546 / 1311 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
02.04.2012, 22:42 9
Т.е. найти первую (, найти последнюю ) и заменить все то, что между ними?
0
ValeryS
Модератор
7372 / 5573 / 707
Регистрация: 14.02.2011
Сообщений: 18,942
02.04.2012, 22:42 10
Цитата Сообщение от intnower Посмотреть сообщение
if(str[i]=='(')
i=a;
что ты этим хотел сделать???
Цитата Сообщение от intnower Посмотреть сообщение
for(i=a+1;str[i]!=')';i++)
а если не будет закрывающей скобки куда упадем???
попробуй использовать стек
после '(' все запихиваем в стек
после ')' достаем из стека и меняем значение на пробел
ну и конечно обработчик конца строки
если есть вылетаем с ошибкой или пишем " не корректная строка"
0
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++)
получилось, что Я перебираю все элементы, которые находятся в скобках.. А вот можно ли их как-нибудь заменить на пробел?
0
soon
2546 / 1311 / 177
Регистрация: 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;
}
1
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;
}
а если нужно будет заменять в текстовом файле, Я так понимаю, этот код уже не проканает? (:
0
Avazart
Эксперт С++
7759 / 5664 / 555
Регистрация: 10.12.2010
Сообщений: 25,666
Записей в блоге: 17
02.04.2012, 23:01 14
Кажется не подойдет для строки с несколькими комментариями "бла1 ( комент1 ) бла2 ( комент2 )" вырежет бла2
0
intnower
0 / 0 / 0
Регистрация: 12.01.2012
Сообщений: 68
02.04.2012, 23:03  [ТС] 15
а что значит str.find и str.rfind
0
soon
2546 / 1311 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
02.04.2012, 23:03 16
Avazart, ТС сам попросил найти первый и последний, а затем вырезать все что между ними.

Цитата Сообщение от intnower Посмотреть сообщение
а если нужно будет заменять в текстовом файле, Я так понимаю, этот код уже не проканает? (:
Считываете в переменную, меняете, записываете в файл
0
ValeryS
Модератор
7372 / 5573 / 707
Регистрация: 14.02.2011
Сообщений: 18,942
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
2546 / 1311 / 177
Регистрация: 09.05.2011
Сообщений: 3,086
Записей в блоге: 1
02.04.2012, 23:10 18
Цитата Сообщение от intnower Посмотреть сообщение
а что значит str.find и str.rfind
Искать с начала и с конца строки соответственно.
1
Avazart
Эксперт С++
7759 / 5664 / 555
Регистрация: 10.12.2010
Сообщений: 25,666
Записей в блоге: 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
02.04.2012, 23:24
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.04.2012, 23:24

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

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

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


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

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

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