Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> "Глюк" в строковом анализаторе 
:(
    Опции темы
Lotles
Дата 31.7.2010, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 6.4.2010

Репутация: нет
Всего: нет



Подскажите почему код выдает всякий мусор, подает звуковые сигналы
Должен работать так:


Если введешь так:
"11/23/34" или "11.23.34" или "11.23/34", то должен получить
11
23
34
Код

      #include "stdafx.h"
      #include <conio.h>
      using namespace std;
      class StringParser {
      private:
         int pos;
         char* input_str;
         char* delimiters;
      public:
         int more()   {
         return input_str[pos]!='\0';
         }
         StringParser(char* inp, char* delim){
         input_str = inp; delimiters = delim; pos = 0;
             }
         char* get(){
         int j = 0;
         char* new_str;
         new_str = new char[100];

         while (! strchr(delimiters, input_str[pos]) && input_str[pos]!='\0'){
             new_str[j] = input_str[pos];
             pos++; 
             j++;
         }

         while (strchr(delimiters, input_str[pos]))
         pos++;


         new_str[j]='\0';
         return new_str;
         }
      };
      int main() {
         char input_str[100];
         char* ch;      
         cout << "Enter input line: "; 
         cin.getline(input_str, 99);
         StringParser parser(input_str, "/,");
         while (parser.more()){
         ch = parser.get();
         cout << ch << endl;
         delete[]ch;
         }
         return 0;
      }


Это сообщение отредактировал(а) Lotles - 31.7.2010, 17:01
PM MAIL Skype   Вверх
djamshud
Дата 31.7.2010, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Пердупержденный
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 23.11.2009

Репутация: 4
Всего: 39



Ой, как сложно.
Код

//input data
char const *str="12.34/56";
char const *delim="./";

//alg vars
char const *ptr,*prev=str;

//alg
while((ptr=strpbrk(prev,delim))!=0){
printf("%.*s\n",ptr-prev,prev);//here you can copy bytes between prev and ptr.
prev=ptr+1;}
printf("%s\n",prev);//here you can copy bytes between prev and '\0'.

А дальше оборачивайте в класс, или как вам больше нравится.

Добавлено через 57 секунд
Потом я еще сам проверю, работает ли мой кодsmile. Но вообще должен.


--------------------
'Cuz I never walk away from what I know is right
Alice Cooper - Freedom
PM   Вверх
Lotles
Дата 31.7.2010, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 46
Регистрация: 6.4.2010

Репутация: нет
Всего: нет



Цитата(djamshud @ 31.7.2010,  17:33)
Ой, как сложно.
Код

//input data
char const *str="12.34/56";
char const *delim="./";

//alg vars
char const *ptr,*prev=str;

//alg
while((ptr=strpbrk(prev,delim))!=0){
printf("%.*s\n",ptr-prev,prev);//here you can copy bytes between prev and ptr.
prev=ptr+1;}
printf("%s\n",prev);//here you can copy bytes between prev and '\0'.

А дальше оборачивайте в класс, или как вам больше нравится.

Добавлено @ 17:34
Потом я еще сам проверю, работает ли мой кодsmile. Но вообще должен.

Вы мне в моем коде ошибку исправьте, потому что то что вы делаете я еще не умею. Допустим printf пока не знаю,
эти какие то непонятные знаки %s\n и вобще меня больше интерисует не программа, а именно случай почему так происходит, поэтому не надо писать свой алгоритм, а подскажите почему у меня прога работает таким образом
Вобще прога работает, если сделать так:
Код

      #include "stdafx.h"
      #include <conio.h>
      using namespace std;
      class StringParser {
      private:
         int pos;
         char* input_str;
         char* delimiters;
      public:
         int more()   {
         return input_str[pos]!='\0';
         }
         StringParser(char* inp, char* delim){
         input_str = inp; delimiters = delim; pos = 0;
             }
         char* get(){
         int j = 0;
         char* new_str;
         new_str = new char[100];
         while (strchr(delimiters, input_str[pos]))
         pos++;
         while (! strchr(delimiters, input_str[pos]) && input_str[pos]!='\0'){
             new_str[j] = input_str[pos];
             pos++; 
             j++;
         }

         new_str[j]='\0';
         return new_str;
         }
      };
      int main() {
         char input_str[100];
         char* ch;      
         cout << "Enter input line: "; 
         cin.getline(input_str, 99);
         StringParser parser(input_str, "/,");
         while (parser.more()){
         ch = parser.get();
         cout << ch << endl;
         delete[]ch;
         }
         return 0;
      }

А если сделать как в предедущем случае, т.e поменять цикл местами, то не работает(не пойму почему)

Это сообщение отредактировал(а) Lotles - 31.7.2010, 18:13
PM MAIL Skype   Вверх
bsa
Дата 1.8.2010, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(Lotles @  31.7.2010,  19:09 Найти цитируемый пост)
Допустим printf пока не знаю, эти какие то непонятные знаки %s\n
printf = "форматированная печать". %s значит, напечатать строку. К алгоритму это отношения не имеет - это вывод готового результата.

Lotles, зачем strchr в цикле? и вообще, лучше использовать strcspn для этих целей - тебе сразу будет найден первый разделитель из указанного набора (т.е. можно оба разделителя указать в списке).
PM   Вверх
ИванМ
Дата 2.8.2010, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1260
Регистрация: 19.6.2006
Где: СПб

Репутация: 3
Всего: 23



В стиле C++:
Код

#include <iostream>
#include <string>
#include <boost/regex.hpp>

int main(int argc, char* argv[])
{
    std::string str;
    std::getline(std::cin, str);

    boost::regex regex("(\\d{2})[.|/](\\d{2})[.|/](\\d{2})");
    boost::smatch match;
    if ( boost::regex_match( str, match, regex ) )
        for ( size_t i = 1; i < match.size(); ++ i )
            std::cout << std::string( match[i].first, match[i].second ) << std::endl;

    system("pause");
}

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0452 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.