Вопрос по strtok, string, c++, string-split – Пустой чек с разделением строки

0
vector<string> SplitString (string aString,char *sep) 
{  
  vector<string> vec;
  char * cstr,*val,*p;
  string str = aString;
  cstr = new char [str.size()+1];
  strcpy (cstr, str.c_str());
  p=strtok (cstr,sep);
  while(p!=NULL)
  {    
    vec.push_back(p);  
    p=strtok(NULL,sep);

  }delete[] cstr;return vec; }

Это мой код для разделения строк. Я отправил приведенную ниже строку, чтобы разделить ее разделителем & amp;

"f0=fname0&l0=lname0&f1=fname1&l1=lname1&f2=fname2&l2=lname2&f3=&l3=".

Я получил результат в векторе, как показано ниже.

f0=fname0 l0=lname0 f1=fname1 l1=lname1 f2=fname2 l2=lname2 f3= l3=

Теперь я снова отправил приведенные строки с разделителем «=». Он отлично работает с "l2 = lname2". Но для & quot; f3 = & quot; и & lt; l3 = & quot; Мой разделитель в последней позиции строки. Поэтому я не смог найти значение, равное нулю или нет. Я хочу знать, является ли значение (левая сторона «=» - это имя, а правая сторона - это значение) пустым или нет. Как я могу это проверить.

Вы можете быть заинтересованы вthis question. Björn Pollex

Ваш Ответ

2   ответа
0

является ли последний символ строки, которую вы токенизируете, фактически самим разделителем.

while (p != NULL && p[strlen(p) - 1] != *sep)

Edit: Исходя из вашего комментария, перед тем, как пометить строку, я бы изменил ее, используяstring::find а такжеstring::replace заменить вхождения & quot; = & amp; & quot; с & quot; = hi & amp; & quot; и завершающий & quot; = & quot; с & quot; = привет & quot ;. Таким образом, вы избежите неуклюжего анализа.

Кроме того, тогда вам не понадобится два прохода токенизации, потому чтоstrDelimit параметрstrtok тогда может быть "& amp; =" (оба разделителя за один проход).

результат такой же, как и раньше. Я хочу нажать на строку типа "привет" если я нашел пустую строку. если моя строка похожа на "f2 = fname2 & l2 = lname2 & f3 = & l3 =" значит, я хочу вставить вектор как f2, fname2, l2, lname2, f3, привет, l3, привет. Smith Dwayne
0

что это самый простой способ разбить строку.

#include <algorithm>
#include <iterator>
#include <boost/algorithm/string.hpp>
using namespace std;
using namespace boost;

int main()
{
    string s("f0=fname0&l0=lname0&f1=fname1&l1=lname1&f2=fname2&l2=lname2&f3=&l3=");

    vector<string> v1;    
    split(v1, s, is_any_of("&"), token_compress_on); 
    copy(v1.begin(), v1.end(), ostream_iterator<string>(cout, "\n"));    

    for (auto i : v1) {
        vector<string> v2;
        split(v2, i, is_any_of("="), token_compress_on); 

        copy(v2.begin(), v2.end(), ostream_iterator<string>(cout, "\n===\n"));
    }
}
фатальная ошибка: boost /gorithm / string.hpp: такая компиляция файлов или каталогов не прекращена. Smith Dwayne
@SmithDwayne, конечно, вам нужно установить егоboost.org

Похожие вопросы