forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   с++: проблема с функцией извлечения текста &am (http://forum.boolean.name/showthread.php?t=11727)

aureli0 13.01.2010 21:19

с++: проблема с функцией извлечения текста &am
 
Хочется сделать функцию для извлечения слова из строчки слов,разделенных разделителем.
StringWordGet(string str,string separ,int token_index)
где str-строка источник, separ-разделитель, token_index-позиция слова.
Например, если
str="aaa,bbb,ccc,ddd,eee,fff"
separ=","
0-ое слово будет aaa
1-е bbb
2-e ccc
и т.д. Вот такая прога для этого у меня получается:
Код:

string str="aaa,bb,ccccc,d,eeeeee";//исходная строка-токены 0,1,2,3,4
string separ=",";//разделитель

string::size_type pos;//= int-текущий номер позиции разделителя
int pos_index=1,//текущий индекс массива позиций разделителя
    *pos_massive;//массив местоположения разделителей (от 0 до хрена ())

pos=str.find_first_of(separ);//позиция,где попадается первый разделитель
//1) заполняем массив позиций разделителя
while (pos != string::npos)//пока не пройдемся по всей строке
 {
  pos_massive[pos_index]=pos;
  pos = str.find(separ,pos+1);
  pos_index=pos_index+1;
 }
//2) вырезаем кусок текста-токен
string token;//кусок текста
int token_index=2;//номер токена
if (token_index==0) {token=str.substr(0,pos_massive[token_index+1]);}
else
 {
  token=str.substr(pos_massive[token_index]+1,pos_massive[token_index+1]-pos_massive[token_index]-1);
 }
 
cout << token <<endl;

Выводом будет: ccccc

Вот сама функция из этой проги получается такой:
Код:

string StringWordGet(string str,string separ,int token_index)
 {
  string::size_type pos;//= int-текущий номер позиции разделителя
  int pos_index=1,//текущий индекс массива позиций разделителя
    *pos_massive;//массив местоположения разделителей (от 0 до хрена ())

  pos=str.find_first_of(separ);//позиция,где попадается первый разделитель
  //1) заполняем массив позиций разделителя
  while (pos != string::npos)//пока не пройдемся по всей строке
  {
    pos_massive[pos_index]=pos;
    pos = str.find(separ,pos+1);
    pos_index=pos_index+1;
  }
  //2) вырезаем кусок текста-токен
  string token;//кусок текста
  if (token_index==0) {token=str.substr(0,pos_massive[token_index+1]);}
  else
  {
    token=str.substr(pos_massive[token_index]+1,pos_massive[token_index+1]-pos_massive[token_index]-1);
  }
  return token;
 }

Проблема в том, что ее вызов вываливается с Segmentation fault. Хотя все компилится. Что надо исправить?

jimon 13.01.2010 23:00

Ответ: с++: проблема с функцией извлечения текст&am
 
ух
Код:

int pos_index=1,
    *pos_massive;

и где ты инициализируешь pos_massive ? он же у тебя указывает в никуда

Morganolla 13.01.2010 23:59

Ответ: с++: проблема с функцией извлечения текст&am
 
На мой взгляд - это обрывки от чего-то большего ... тут трудно точно ответить, так как некоторые вещи не определены...
ЗЫ это из курсовой или зачета? :)
ЗЗЫ еще надо написать #include "string.h" а то работать не будет...

ISergey 14.01.2010 09:45

Ответ: с++: проблема с функцией извлечения текст
 
Цитата:

Хочется сделать функцию для извлечения слова из строчки слов,разделенных разделителем.
Уже есть в Си..
http://www.cplusplus.com/reference/c...string/strtok/

aureli0 14.01.2010 21:02

Re: с++: проблема с функцией извлечения текста
 
большое спасибо отписавшимся) решение нашол-действительно надо было выделять память для массива pos_massive

HolyDel 16.01.2010 03:32

Ответ: с++: проблема с функцией извлечения текст
 
а проще использовать std::vector и непариться (если скорость не критична, а судя по коду - она не критична, иначе бы резльтаты кешировались).


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

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot