Страница 1 из 1

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

Добавлено: 30 сен 2010, 19:00
Lotles
Почему код выдает "мусор"
Должен работать так:
Например пишешь 12/23/34
Должен выдать
12
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++;
             new_str[j]='\0';
                 }
                 while (strchr(delimiters, input_str[pos]))
         pos++;
         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;
      } 

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

Добавлено: 30 сен 2010, 21:05
Romeo
А дебагером воспользоваться не пробовал? :)

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

Добавлено: 02 окт 2010, 13:44
Lotles
Romeo писал(а):А дебагером воспользоваться не пробовал? :)
Немного переделал код

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

      #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++;
                 }
                 new_str[j]='\0';
                 while (strchr(delimiters, input_str[pos]))
         pos++;
                 return new_str;
         }
      };
      int main() {
         char input_str[100];
         char* ch;      
         cout << "Enter input line: "; 
         cin.getline(input_str, 99);
         int len=strlen(input_str);
         input_str[len+1]='\0';
         StringParser parser(input_str, "/,");
                 while (parser.more()){
                 ch = parser.get();
         cout << ch << endl;
                 delete[]ch;
                 }
         return 0;
      } 
Все равно не работает
А что за дебагер, не слышал про него
Извините что поздно отвечаю, проблемы с интернетом

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

Добавлено: 04 окт 2010, 13:14
azrael
Проблема вот здесь:

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

while (strchr(delimiters, input_str[pos]))
         pos++;
Вы не проверяете, что достигли конца строки. До этого программа работает правильно и выводит подстроки по очереди, однако после последнего программа не останавливается на \0, а продолжает искать разделители, пока не залезет в чужую память и не выдаст access violation.

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

Добавлено: 05 окт 2010, 00:26
Lotles
ПАсиба !!!!!!!!
Вообще, проверку на '\0' получается надо и здесь делать

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

while (! strchr(delimiters, input_str[pos])){
   new_str[j] = input_str[pos];
   pos++;
   j++;
}
new_str[j]='\0';
просто прокатывает то, в new_str[pos] копируется '\0', а потом всякий мусор, пока не встретит разделитель, просто этот мусор не отображается , потому что стоит '\0'
Если здесь не делать проверку на '\0', есть вероятность что new_str[pos] попытается скопировать "запрещенную" память
Правильно ?

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

Добавлено: 05 окт 2010, 10:43
azrael
Угу, если введете строку без разделителей, то, скорее всего, так и будет.
Поэтому предлагаю написать все проще, используя функцию strtok. По ссылке есть пример, который делает все что вам надо: http://www.cplusplus.com/reference/clib ... ng/strtok/

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

Добавлено: 05 окт 2010, 14:24
Lotles
Да мне просто надо было разобраться с этим примером, потому что я делаю по книге и дальше этот код будет дополняться я правда код немного переделал, потому что как там написано я не понял

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

Добавлено: 05 окт 2010, 20:29
rrrFer

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

#include <conio.h>
#include <iostream>
using namespace std;

class StringParser{
	 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++;
			new_str[j]='\0';
		}
		while (input_str[pos]&&strchr(delimiters, input_str[pos]))
			pos++;
		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;
	}
	cin.get();
	return 0;
}
while (input_str[pos]&&strchr(delimiters, input_str[pos]))
pos++;
вот тут вы перепрыгивали через символ конца строки и в ней появлялся мусор, поэтому
int more(){
return input_str[pos]!=0;
}
начинала работать неверно