Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Помощь студентам


Ответ
 
Опции темы Опции просмотра
Старый 07.01.2011, 20:04   #1 (permalink)
[Федя]
Новичок
 
Регистрация: 07.01.2011
Сообщений: 2
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
Unhappy Проблема с одной функцией для разбора строк, язык С/С++

В общем передо мной стоит задача реализовать прогу которая читает как бы unix команду из командной строки и относит ее отдельные части (слова) к четырем типам
1 - собственно сама команда
2 - параметры команды
3 - ключи
4 - параметры ключей
Ее надо реализовать с использованием конечного автомата. я это сделал (правильно ли - другой вопрос, но сейчас не об автоматах пойдет речь).

У меня проблема с одной функцией, на первый (мой) взгляд тривиальнейшей, но она не работает так как считает, что первый пробел между словами - это NULL символ.
В общем прога в целом у меня достаточно большая, но я вкратце объясню - есть функция (та самая проблемная) BufferWriter, на каждом ее прогоне, она должна заносить из введенной команды в буфер отдельные *единицы* этой командной строки, это либо одно слово отделенное от других пробелами, либо несколько слов если они заключены в кавычки (заносит все слова внутри кавычек + сами кавычки). За один её вызов она заносит одну из таких единиц в буфер, а когда её вызываешь снова она буфер очищает и опять заносит туда следующие единицы. Потом автомат этот буфер читает, но это уже не важно для вопроса.

В общем BufferWriter должна игнорировать пробелы до первого символа слова, затем, как только встречает символ не-пробел, начинает все это заносить в буфер по одному символу, пока не встретит пробел (при условии что не было кавычек, если были кавычки, она останавливается когда найдет вторую, закрывающую кавычку), а как только встречает пробел останавливается. На следующем вызове функции она очищает буфер и продолжает с места, на котором остановилась.
Вся проблема в том что когда она находит пробел она думает что это не символ пробела а NULL символ. Плюс к тому я еще использую функцию isspace() (ctype) которая по идее должна возвращать 0 когда видит символ не-пробел, и возвращает не ноль когда видит пробел. Но она на пробел который я ввожу возвращает 0...

В общем я не очень пойму как сделать так что бы она адекватно реагировала и на пробел и на не-пробел и на NULL символ. NULL символ мне тоже надо распознавать, так как с ним связано несколько флагов важных для автомата, т.е. все флаги должны в функции работать как задумано

Чего надо добиться:
Если есть строка:
wh "hg ds nu" mn dwe "wde"
и есть 5 вызовов функции BufferWriter, то
при первом вызове функции, в буфере оказалось - wh
при втором вызове функции, в буфере оказалось - "hg ds nu"
при третьем вызове функции, в буфере оказалось - mn
при четвертом вызове функции, в буфере оказалось - dwe
при пятом вызове функции, в буфере оказалось - "wde"
при этом неважно, сколько пробелов между словами

в общем вот две ссылки, в первой ссылке программа полностью (с автоматом у меня там тоже косяки но пока не так важно), во второй программа реализующая отдельно функцию BufferWriter () которая должна занести 4 отдельные единицы (слова или группы слов в кавычках) введенной строки в буфер
paste.org.ru - полностью прога
paste.org.ru - прога с отдельной функцией

Буду очень благодарен всем кто хоть чем то поможет.
[Федя] вне форума   Ответить с цитированием

Старый 07.01.2011, 20:04
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Скорее всего проблема уже была решена ранее в других обсуждениях

Помогите, пожалуйста, с функцией С++
Автоматическа нумерация строк
Проблема с запуском одной программы из другой
Программа с функцией. Графика.
Термометр с дополнительной индикацией
Обработка строк символов.

Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 07:40.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.