|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - C++ проблема со строками |
|
C/C++ - C++ проблема со строками
|
Новый участник Сообщения: 3 |
Доброе утро, мне было задано написать программу о том, соответствует ли каждой открывающей скобке, каждая закрывающая, среди символов строки могут встречаться и другие символы... вот он код. Программа не работает при входных данных
ывп() ()вапрвапоаопр()( ()()()()()()()( Использовать индексацию, как в массиве запрещено, только команды string в чем проблема? помогите исправить, спасибо большое #include "cstring" #include "fstream" int main(){ std::ifstream fin("in.txt", std::ios::in); std::ofstream fout("out.txt", std::ios::out); char str[255]; char* itr; fin >> str; if (strchr(str, ')') == str){ fout << "Error"; return 0; } for (char* char1 = str; char1; char1 = strchr(char1, '(')){ if (strchr(char1, ')') > char1) { *strchr(char1, ')') = ' '; *char1 = ' '; continue; } } if (strchr(str, ')')){ fout << "Error"; return 0; } fout << "Will be OK"; return 0; } |
|
Отправлено: 07:02, 25-02-2012 |
![]() Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать vlad3009
1. чтение из потока указателя на память - это игра в русскую рулетку (стрельба себе в голову из револьвера) 2. почему бы на самом деле не почитать про класс string и не использовать его вместо chrstr? достаточно загуглить "c++ string" 3. про запрет использовать индексирование ты имхо загнул |
Отправлено: 12:35, 25-02-2012 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
![]() Новый участник Сообщения: 29
|
Профиль | Отправить PM | Цитировать Может, кривовато (сам новичек), но работает и без индексирования.
#include <cstdlib> #include <iostream> #include <string> using namespace std; int main(int argc, char *argv[]){ string str; int skob=0; // счетчик скобок cout << "Введите строку" << endl; getline(cin, str); // строка читается до нажатия Enter // либо ввести cin >> str; если надо до любого разделителя // Ищем первую скобку for (string::size_type is=0; is != str.size(); ++is){ // Если первая - закрывающаяся - выходим из программы if (str.at(is)==')'){ cout << "Начинается с закрывающейся скобки!" << endl; system("PAUSE"); return EXIT_SUCCESS; } // если открывающаяся - всё норм, заканчиваем цикл и продолжаем if (str.at(is)=='(') break; } /*Перебираем все символы строки без использования индексирования. *Если встретили (, то увеличиваем счетчик; если ) - уменьшаем. *В остальных случаях ничего не делаем. */ for (string::size_type is=0; is != str.size(); ++is){ if (str.at(is)=='(') ++skob; if (str.at(is)==')') --skob; } // если скобки не парные - счетчик отличен от нуля if (skob) cout << "Напарные скобки" << endl; else cout << "Скобки соответствуют друг другу" << endl; system("PAUSE"); return EXIT_SUCCESS; } |
Последний раз редактировалось ab.random, 25-02-2012 в 14:10. Отправлено: 13:41, 25-02-2012 | #3 |
Новый участник Сообщения: 3
|
Профиль | Отправить PM | Цитировать ab.random, Не, не совсем все работает, также как и у меня есть косяки, я свои отыскать не могу, за идею спасибо, чуток лучше моей работает)
pva, Препод сказал, надо без индексации... Вот так... Ошибки не нашли? |
Отправлено: 15:09, 25-02-2012 | #4 |
![]() Новый участник Сообщения: 29
|
Профиль | Отправить PM | Цитировать vlad3009, а в чем именно косяки? Дай или полное условие, или приведи примеры. Разберемся.
|
|
Отправлено: 18:19, 25-02-2012 | #5 |
Новый участник Сообщения: 3
|
Профиль | Отправить PM | Цитировать ab.random, ()()()()()()()(
ывпвыап()()()()()() ()ывпвапвкп(вапвапр)(вап(ывапывп)апв) примеры такие)) |
Отправлено: 22:07, 25-02-2012 | #6 |
![]() Новый участник Сообщения: 29
|
Профиль | Отправить PM | Цитировать vlad3009, во вложении 4 скрина с работой программы с вашими примерами. По-моему, всё правильно делает. Или я условие неправильно понял.
|
Отправлено: 23:41, 25-02-2012 | #7 |
![]() Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать vlad3009, мне интересно было бы увидеть твой пересказ на русском языке (т.е. ещё не программу) того, как бы ты хотел проверить балансировку скобок. А то я не понимаю, что ты хочешь закодировать, а своё навязывать не хотел бы.
ab.random, если придираться, то string::at() - это тоже индексация, но с проверкой на вхождение индекса в диапазон. Как я понял, ты хочешь посчитать разницу между количеством открывающихся и закрывающихся скобок. Вот как это можно сделать ещё: #include <algorithm> #include <string> using namespace std; ... string line; getline(cin, line); if (line.rfind(')', line.find('('))==string::npos) { if (count(line.begin(), line.end(), '(') == count(line.begin(), line.end(), ')')) { cout << "скобки совпадают" << endl; } else { cout << "скобки не совпадают" << endl; } } else { cout << "начинается с закрывающей скобки" << endl; } |
Отправлено: 13:03, 10-03-2012 | #8 |
![]() Новый участник Сообщения: 29
|
Профиль | Отправить PM | Цитировать pva, at() - это метод, не индексация. Но если и так нельзя, тогда можно воспользоваться итераторами string::iterator. Тогда точно никак не придраться, а код будет почти таким же.
Но у Вас красивее решение. |
Отправлено: 10:33, 11-03-2012 | #9 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
VBA - Работа со строками | zena | Программирование и базы данных | 5 | 21-02-2011 09:03 | |
StringRegExp - как получить содержимое между 2-мя строками | evg64 | AutoIt | 2 | 05-12-2009 01:19 | |
C/C++ - [решено] Работа с строками | crashtuak | Программирование и базы данных | 16 | 26-03-2009 01:21 | |
CMD/BAT - [решено] Работа со строками в cmd-файлах | melato | Скриптовые языки администрирования Windows | 3 | 30-01-2007 08:52 | |
Помогите разобратся со строками в С++ | Guest | Программирование и базы данных | 12 | 22-05-2004 04:49 |
|