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

Согласно Аннотированный раздел 11.11 ECMAScript 5.1 :

В случае логического оператора OR (||),

expr1 || expr2 Возвращает expr1, если он может быть преобразован в true; в противном случае возвращает expr2. Таким образом, при использовании с булевыми значениями || возвращает true, если оба операнда истинны; если оба значения false, возвращает false.

blockquote>

В данном примере

var oneOrTheOther = someOtherVar || «Это не дроиды, которые вы ищете ... двигаться вперед»;

Результатом будет значение someOtherVar, если логическое значение (someOtherVar) истинно. (См. Truthiness of выражение ). Если это неверно, результатом будет «это не дроиды, которые вы ищете ... двигаться вперед»;

И в случае логического оператора AND (& amp;),

Возвращает expr1, если его можно преобразовать в false; в противном случае возвращает expr2. Таким образом, при использовании с булевыми значениями & amp; & amp; возвращает true, если оба операнда истинны; в противном случае возвращает false.

blockquote>

В данном примере,

case 1: когда Boolean (someOtherVar) является false: он возвращает значение someOtherVar.

case 2: когда Boolean (someOtherVar) истинно: он возвращает «это не дроиды, которые вы ищете ... двигаться вперед».

19
задан jimi hendrix 1 March 2009 в 15:58
поделиться

9 ответов

Вот функция разделения 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);
    }
}
18
ответ дан 30 November 2019 в 02:52
поделиться

Нет никакого встроенного способа разделить строку в C++, но , повышение обеспечивает строковый алгоритм библиотека, чтобы сделать весь вид обработки строк, включая строку разделение .

11
ответ дан 30 November 2019 в 02:52
поделиться

Да, stringstream.

std::istringstream oss(std::string("This is a test string"));
std::string word;
while(oss >> word) {
    std::cout << "[" << word << "] ";
}
10
ответ дан 30 November 2019 в 02:52
поделиться

строки 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;
7
ответ дан 30 November 2019 в 02:52
поделиться
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);
}
3
ответ дан 30 November 2019 в 02:52
поделиться

Ответ нет. Необходимо повредить их использование одной из библиотечных функций.

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

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() метод и записать фильтр.

1
ответ дан 30 November 2019 в 02:52
поделиться

Какого черта... Вот моя версия...

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

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

 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;
}
0
ответ дан 30 November 2019 в 02:52
поделиться

струны до

Просто вставляют \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;
}
-2
ответ дан 30 November 2019 в 02:52
поделиться

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

-2
ответ дан 30 November 2019 в 02:52
поделиться
Другие вопросы по тегам:

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