Строковый анализатор

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Lotles
Сообщения: 59
Зарегистрирован: 03 июл 2010, 12:42

Исправьте код, работать должен так:

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

Если введешь так:
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])){
			 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;
      }

Этот код выдает всякий мусор, подает звуковые сигналы, подскажите в чем причина !
Ilyxa
Сообщения: 6
Зарегистрирован: 28 июл 2010, 07:41

покури библиотеку boost, шаблон tokenizer. Твой пример в 3 строчки уместится))
Меня, например, всегда строки и регекспы в c++ убивали (в конце концов напишешь, но времени уйдет туева гора), плюнул я на это дело, использую готовые решения. Чего и всем советую)
Ilyxa
Сообщения: 6
Зарегистрирован: 28 июл 2010, 07:41

// в общем, почитай про strchr(...) )) она возвращает указатель на первое вхождение символа в строке
// собственно код:

Код: Выделить всё

#include <cstdlib>
#include <iostream>

using namespace std;
class StringParser {
      private:
         int pos;
         char* input_str;
         char* delimiters;
      public:
             
      
      int more()   {
          //cout << "MORE: " << pos << " " << *(input_str) << endl;
          return *(input_str)!=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];
         char* del_pointer = delimiters;

         do {
          ++pos;
          del_pointer=delimiters;
          while(*(del_pointer)) {
          if(*(input_str)==*(del_pointer) ||  *(input_str)=='\0') {             
              ++input_str;               
              return new_str;                      
          }   
          del_pointer++;
          }
         if(j<100)  *(new_str+j)=*(input_str)   ;
          ++j;   
          ++input_str;
         } while (*(input_str));
      }
};

int main(int argc, char *argv[])
{
    //system("PAUSE");
    char input_str[100];
    char* ch;      
    char* delimiters = "/,;_+-*";   
    cout << "Enter input line: ";
    cin.getline(input_str, sizeof(input_str)-1);
    strcat(input_str, "/");                   
    StringParser parser(input_str, delimiters);
    do{ 
        ch = parser.get();
        cout << ch << endl;
        delete[] ch;
    } while (parser.more());
    cin.get();
    return EXIT_SUCCESS;
}

// комменты писать, извини, лень
// проверять на выхождение за границу буфера тоже...
Ответить