Подтвердить что ты не робот

Есть ли встроенный способ разделения строк на С++?

Хорошо? по строке я означает std::string

4b9b3361

Ответ 1

Здесь используется функция разделения типа perl:

void split(const string& str, const string& delimiters , vector<string>& tokens)
{
    // Skip delimiters at beginning.
    string::size_type lastPos = str.find_first_not_of(delimiters, 0);
    // Find first "non-delimiter".
    string::size_type pos     = str.find_first_of(delimiters, lastPos);

    while (string::npos != pos || string::npos != lastPos)
    {
        // Found a token, add it to the vector.
        tokens.push_back(str.substr(lastPos, pos - lastPos));
        // Skip delimiters.  Note the "not_of"
        lastPos = str.find_first_not_of(delimiters, pos);
        // Find next "non-delimiter"
        pos = str.find_first_of(delimiters, lastPos);
    }
}

Ответ 2

Нет встроенного способа разбиения строки на С++, но boost предоставляет строка algo для выполнения всех видов манипуляций с строкой, включая строку split.

Ответ 3

Yup, stringstream.

std::istringstream oss(std::string("This is a test string"));
std::string word;
while(oss >> word) {
    std::cout << "[" << word << "] ";
}

Ответ 4

Строки STL

Вы можете использовать итераторы строк, чтобы выполнить свою грязную работу.

std::string str = "hello world";

std::string::const_iterator pos = std::find(string.begin(), string.end(), ' '); // Split at ' '.

std::string left(str.begin(), pos);
std::string right(pos + 1, str.end());

// Echoes "hello|world".
std::cout << left << "|" << right << std::endl;

Ответ 5

void split(string StringToSplit, string Separators)
{
    size_t EndPart1 = StringToSplit.find_first_of(Separators)
    string Part1 = StringToSplit.substr(0, EndPart1);
    string Part2 = StringToSplit.substr(EndPart1 + 1);
}

Ответ 6

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

Что-то я использую:

std::vector<std::string> parse(std::string l, char delim) 
{
    std::replace(l.begin(), l.end(), delim, ' ');
    std::istringstream stm(l);
    std::vector<std::string> tokens;
    for (;;) {
        std::string word;
        if (!(stm >> word)) break;
        tokens.push_back(word);
    }
    return tokens;
}

Вы также можете взглянуть на метод basic_streambuf<T>::underflow() и написать фильтр.

Ответ 7

Что за черт... Вот моя версия...

Примечание. Разделение на ( "XZaaaXZ", "XZ" ) даст вам 3 строки. 2 из этих строк будут пустыми, а не будет добавлено в theStringVector, если theIncludeEmptyStrings - false.

Разделитель не любой элемент в наборе, а скорее соответствует этой точной строке.

 inline void
StringSplit( vector<string> * theStringVector,  /* Altered/returned value */
             const  string  & theString,
             const  string  & theDelimiter,
             bool             theIncludeEmptyStrings = false )
{
  UASSERT( theStringVector, !=, (vector<string> *) NULL );
  UASSERT( theDelimiter.size(), >, 0 );

  size_t  start = 0, end = 0, length = 0;

  while ( end != string::npos )
  {
    end = theString.find( theDelimiter, start );

      // If at end, use length=maxLength.  Else use length=end-start.
    length = (end == string::npos) ? string::npos : end - start;

    if (    theIncludeEmptyStrings
         || (   ( length > 0 ) /* At end, end == length == string::npos */
             && ( start  < theString.size() ) ) )
      theStringVector -> push_back( theString.substr( start, length ) );

      // If at end, use start=maxSize.  Else use start=end+delimiter.
    start = (   ( end > (string::npos - theDelimiter.size()) )
              ?  string::npos  :  end + theDelimiter.size()     );
  }
}


inline vector<string>
StringSplit( const  string  & theString,
             const  string  & theDelimiter,
             bool             theIncludeEmptyStrings = false )
{
  vector<string> v;
  StringSplit( & v, theString, theDelimiter, theIncludeEmptyStrings );
  return v;
}

Ответ 8

Нет общего способа сделать это.

Я предпочитаю boost:: tokenizer, только его заголовок и прост в использовании.

Ответ 9

Строки C

Просто вставьте \0, где вы хотите разбить. Это примерно так же, как вы можете получить со стандартными функциями C.

Эта функция разбивается на первое появление разделителя char, возвращая вторую строку.

char *split_string(char *str, char separator) {
    char *second = strchr(str, separator);
    if(second == NULL)
        return NULL;

    *second = '\0';
    ++second;
    return second;
}

Ответ 10

Довольно простой метод заключается в использовании метода c_str() для std::string для получения массива символов C-стиля, затем используйте strtok() для tokenize строки. Не так красноречиво, как некоторые из других решений, перечисленных здесь, но это легко и работает.