![]() |
|
Модераторы: bsa |
![]()
|
|
| Winterlord |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 58 Регистрация: 5.10.2008 Репутация: нет Всего: нет |
Добрый вечер, уважаемые программисты! Борланд С++ изучаю сравнительно не долго, соответственно и опыта пока что маловато;) Обращаюсь к вам за помощью, хотелось бы, чтоб вы подкинули идейку, надоумили на решение.
Задача такая: Преобразовать заданную строку следующим образом: заменить все внутренние группы пробелов одним пробелом. Всё это делается при помощи функций библиотеки string.h. С файла в массив фиксированной длины считывается строка с символами, все действия с элементами массива проводятся через указатели. Написал ввод с файла, а дальше хз как. Думаю, что нужно найти первый пробел, далее если за ним идёт ещё один, сдвинуть оставшуюся строку на 1 символ и так далее, как это реализовать - непонятно.
Ещё непонятно почему последний символ повторяется 2 раза. Заранее премного благодарен! Это сообщение отредактировал(а) Winterlord - 16.3.2009, 02:43 |
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 5 Всего: 59 |
ПОЛЬЗУЙТЕСЬ ПОИСКОМ.
Тема 100 раз обсуждалась. Вариант: Я не смотрел ваш код - только изменил имена файлов в древнем своем коде
Кажется работает. Это сообщение отредактировал(а) Anikmar - 16.3.2009, 03:11 |
|||
|
||||
| afanp |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 147 Регистрация: 25.11.2008 Репутация: нет Всего: нет |
посчитать число пробелов, потом их удалить, и добавить один большой пробел в конец?
и эта, считывай в строку из файла с помощью getline в стринг.
ну и там добавляешь потом куда надо пробелы или еще че, если надо вставить все пробелы на место первого, то удаляешь все кроме первого а можно просто запомнить место первого пробела и потом туда еще инсертом все засунуть ) Добавлено через 14 минут Anikmar, я в твоем коде ни шиша не понял Это сообщение отредактировал(а) afanp - 16.3.2009, 21:47 |
|||
|
||||
| Anikmar |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 5 Всего: 59 |
Зачем их считать? Задача была оставить максимум по 1 пробелу - вот я и оставляю. Про количество ничего не было сказано:
Просто такую задачу я уже кому-то помогал делать - вот и остался исходник. А что, он не работает? Вроде как работал. |
||||
|
|||||
| goody |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 23.4.2008 Репутация: нет Всего: нет |
Вот еще вариант :
|
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 5 Всего: 59 |
||||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
но не происходит отсечения начальных и конечных пробелов, хотя имхо должны.. вот вариант с таким отсечением и без использования дополнительного буффера.
P.S. А также без конца не гонятся функция strlen() - которая не просто возвращает размер, а при каждом вызове его считает перебором всех символов. Это сообщение отредактировал(а) mes - 16.3.2009, 22:56 |
|||
|
||||
| Winterlord |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 58 Регистрация: 5.10.2008 Репутация: нет Всего: нет |
Немного поясню задание:
На входе: " The project of the International Phonematic Alphabet " На выходе: " The project of the International Phonematic Alphabet " тоесть должны заменяться только внутренние пробелы на один, а те пробелы, которые находятся перед текстом и за текстом, должны оставаться неизменными. И всё это должно быть реализовано с использованием функций из библиотеки string.h. Обращаться к элементам массива можно только через указатели. Вот и не знаю как сделать=\ Предполагаю, что нужно завести дополнительный массив, искать в первом массиве первый пробел (кроме тех, что перед текстом <-- тоже не совсем понятно как пропустить), далее копировать с исправлениями кусок во второй массив и так далее. В итоге во втором массиве образуется исправленный текст. P.S. Большое спасибо всем откликнувшимся Это сообщение отредактировал(а) Winterlord - 16.3.2009, 23:10 |
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 5 Всего: 59 |
Если брать конкретно мой пример - модифицируйте его - считывайте сразу строку, а затем формируйте результирующую строку и сохраняйте в другой файл.
Добавлено через 14 минут и 40 секунд Вот с использованием string
|
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
имеется ввиду эта библиотека http://cplusplus.com/reference/string/string/ ? Если да, то функции find...of() и substr() Вам в помощь. Только вот не пойму к чему тут указатели. Не спутали ли воедино два разных задания ?! |
|||
|
||||
| Winterlord |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 58 Регистрация: 5.10.2008 Репутация: нет Всего: нет |
Нет, скорее функции вот этой библиотеки: (хотя работаю я в Борланде С++е) http://forum.vingrad.ru/forum/topic-165963...1%82%D0%BC.html И использовать, например, для поиска я хотел strchr() А указатели, думаю, чтоб работать не напрямую со считанным из файла массивом и чтобы к строке через них обращаться, а не посимвольно. Это сообщение отредактировал(а) Winterlord - 17.3.2009, 00:07 |
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 5 Всего: 59 |
Что вы там собрались искать? Пробелы что-ли?
Строка - это массив символов. Какие еще дополнительные указатели нужны? Использовать их вместо операции индексирования []? Так это ради Бога. |
|||
|
||||
| Winterlord |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 58 Регистрация: 5.10.2008 Репутация: нет Всего: нет |
Ну да) я ж писал
Да, наверно так) |
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 5 Всего: 59 |
Мой алгоритм такой:
Идем посимвольно по строчке. Встретили пробел - проверяем флаг. Если флаг установлен - значит пробел не первый, пропускаем. Если флаг не установлен - пробел первый - записываем в результирующую строку. Если символ вообще не пробел - флаг сбрасываем, символ записываем. Никаких поисков в этой задаче не нужно. Каждый поиск - это пробег с начала строки. Зачем? |
|||
|
||||
| Winterlord |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 58 Регистрация: 5.10.2008 Репутация: нет Всего: нет |
А ваш алгоритм игнорирует пробелы перед текстом и после? |
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 5 Всего: 59 |
||||
|
||||
| Winterlord |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 58 Регистрация: 5.10.2008 Репутация: нет Всего: нет |
Я ж тут писал: Совсем запутался) |
|||
|
||||
| Dmi3ev |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1698 Регистрация: 28.11.2007 Репутация: 13 Всего: 41 |
вот накидал... указаетелей - туча...
есть две недоработки: 1) не рассматривал случай, если одни пробелы в строке. 2) в строке с комментарием всегда прибавляется пробел к слову, но при добавлении последнего куска текста этого делать не надо, это остается тебе для размышления, а так вроде нормуль... хотя хз, я не тестил))) Добавлено @ 01:25
те к тексту прибавляется один лишний пробел, думаю сможешь поправить, мне лень... Это сообщение отредактировал(а) Dmi3ev - 17.3.2009, 01:25 -------------------- |
||||
|
|||||
| Winterlord |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 58 Регистрация: 5.10.2008 Репутация: нет Всего: нет |
||||
|
||||
| Dmi3ev |
|
||||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1698 Регистрация: 28.11.2007 Репутация: 13 Всего: 41 |
не важно, просто я компилил в MS VS, тебе надо это убрать и переименовать _tmain() в main Добавлено через 2 минуты вместо
тебе надо
Добавлено через 3 минуты и 11 секунд
а можешь и не править, потому как сзади незаметно))) впереди бы было заметно, а сзади +1 пробел, ничего страшного))) -------------------- |
||||||||
|
|||||||||
| Winterlord |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 58 Регистрация: 5.10.2008 Репутация: нет Всего: нет |
Dmi3ev, Большое спасибо, уж завтра попробую, отпишусь;)
|
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 5 Всего: 59 |
Гы. И мой вариант.
Вроде работает. Варианты - когда конец файла вместо конца строки и одни пробелы в строке вроде как отрабатывает. Недостаток:Если конец файла в строке вместо конца строки - то в результирующем файле добавится конец строки перед концом файла
|
|||
|
||||
| Dmi3ev |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1698 Регистрация: 28.11.2007 Репутация: 13 Всего: 41 |
вот тебе:
дурацкие действия не предусмотрены, но если все будет нормально, то это прога работает... -------------------- |
||||
|
|||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
не смотря на обилие кода в этой теме, вношу свою лепту:
Это сообщение отредактировал(а) mes - 17.3.2009, 03:23 |
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
вот еще подправил
теперь логика обработки как начальных так и конечных пробелов отделена от центральных. Это сообщение отредактировал(а) mes - 17.3.2009, 10:06 |
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 5 Всего: 59 |
Ну, препода просто завалить можно вариантами
|
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
теперь главное, чтоб тс сам не "завалился" в этом изобилии |
|||
|
||||
| Winterlord |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 58 Регистрация: 5.10.2008 Репутация: нет Всего: нет |
Dmi3ev, Ваша программа работает, но съедает любое первое слово. Например на входе " The project of the International Phonematic Alphabet ", а на выходе: " project of the International Phonematic Alphabet" И что то это никак не исправить=\ mes, Ваша программа работает, но, если я прально понял, вообще не использует библиотеку string.h Это сообщение отредактировал(а) Winterlord - 18.3.2009, 11:55 |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
||||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 5 Всего: 59 |
Ну а хоть мой код работает?
|
|||
|
||||
| Dmi3ev |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1698 Регистрация: 28.11.2007 Репутация: 13 Всего: 41 |
да надо после первого вызова strtok добавить
+ еще добавить условие конца файла, строки, но даже при таких раскладах должна работать, хоть и будет выдавать ошибку, но файл правильно заполнит... точнее, должна выдать ошибку, я не проверял... -------------------- |
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
вот с библиотекой..
P.S. s - используется фактически как счетчик отработанных символов, p и p1 для поиска вперед. добавил комменты Это сообщение отредактировал(а) mes - 19.3.2009, 01:18 |
|||
|
||||
| Winterlord |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 58 Регистрация: 5.10.2008 Репутация: нет Всего: нет |
Anikmar, Для меня без комментариев очень сложно понять ваш код. Если там используются флаги, то их нельзя использовать=\
mes, напишите пожалуйста хотя б поверхностные комментарии. И куда в функции мейн воткнуть dst? Dmi3ev , теперь первое слово выводится прально, но съедаются пробелы после него, тоесть между первым и вторым и последние пробелы из исходного текста не переносятся в изменённый. P.S. Большое спасибо, что помогаете Это сообщение отредактировал(а) Winterlord - 19.3.2009, 01:22 |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
написал вот пример вызова :
|
|||
|
||||
| Dmi3ev |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1698 Регистрация: 28.11.2007 Репутация: 13 Всего: 41 |
не пробелы, а один пробел! надо еще дописать после цикла:
Проявите фантазию -------------------- |
||||
|
|||||
| Winterlord |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 58 Регистрация: 5.10.2008 Репутация: нет Всего: нет |
mes, Большое спасибо, вроде работает, входные\выходные файлы надеюсь, что сам смогу прикрутить)
Dmi3ev, И вам большое спасибо. Да, постараюсь доделать) если не сложно, напишите пожалуйста комментарии к вашему коду, хотя б поверхностные |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Еще вариант, правда без string.h, но зато с родными для Borland'а строками (AnsiString) - так, на закуску
Это сообщение отредактировал(а) xvr - 19.3.2009, 12:52 |
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 5 Всего: 59 |
А флаги почему нельзя? На самом деле мой код от остальных отличается принципиально только тем, что он однопроходный - т.е. все идет в одном цикле. Если флаги нельзя- тогда мой код можете выкинуть. |
|||
|
||||
| Winterlord |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 58 Регистрация: 5.10.2008 Репутация: нет Всего: нет |
Препод сказал, по идее флаги можно использовать только в следующей работе. Другая тема) mes, Вот ваша функция мейн, только с добавленным чтением с файла:
Как исправить такую проблему, что если ввести строку, где последние символы пробелы (хотя бы один) - то всё нормально, если же ввести строку, где последние символы не пробелы - при выводе добавляется произвольный лишний символ. И если ввести только пробелы - выводятся пробелы - нормально, а если ввести меньше 8-ми пробелов или просто много пробелов - выводится крокозябра) Заранее благодарен. P.S. Если компилировать на Борланде С++ 3.1, то при выводе в конце строки прибавляется крокозябра. Если компилировать в Dev C++, то только когда меньше восьми пробелов и когда их очень много. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
вы считывайте из файла буфер. Чтоб этот буффер можно было считать строкой в конце должен стоять '\0'
если Вы работаете с одной строкой, которая меньше по длине, чем размер буффера, то достаточно обнулить этот буфер изначально. стр 3:
|
|||
|
||||
| Winterlord |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 58 Регистрация: 5.10.2008 Репутация: нет Всего: нет |
mes, Большое спасибо, пока работает) воспользовался обнулением
|
|||
|
||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
переменные F и P очень портят вид кода, Гулливер и то, имхо, смотрелся лучше. Учитывая, что пользуетесь stl, гораздо симпатичнее смотрелись бы fin и fout. Добавлено @ 23:27 не вытерпел, подправил код.. Вам для примера, ну а мне чтоб глаза не резал
Это сообщение отредактировал(а) mes - 21.3.2009, 23:31 |
||||
|
|||||
| Winterlord |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 58 Регистрация: 5.10.2008 Репутация: нет Всего: нет |
mes, Огромное спасибо) Я не волшебник, а только учусь ^_^
|
|||
|
||||
| Winterlord |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 58 Регистрация: 5.10.2008 Репутация: нет Всего: нет |
Anikmar,
Dmi3ev, mes, Большое вам спасибо, помогли. Сегодня сдал прогу) ^_^ |
|||
|
||||
| Winterlord |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 58 Регистрация: 5.10.2008 Репутация: нет Всего: нет |
Вопрос решён
|
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |