Хорошо? по строке я означает std::string
Есть ли встроенный способ разделения строк на С++?
Ответ 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 строки. Не так красноречиво, как некоторые из других решений, перечисленных здесь, но это легко и работает.