Мне нужно разбить образец строки с strok
функции strok
с помощью C++. Строка образца: "This|is||a||sample||string|"
, в то время как разделить это, используя strok
.
#include <stdio.h>
#include <string>
#include <string.h>
using namespace std;
int main()
{
string str="This||a||sample||string|";
string a;
str=strtok ((char *)str.c_str(),"|");
while (str.c_str() != NULL)
{
printf ("str:%s\n",str.c_str());
str = strtok (NULL, "|");
}
return 0;
}
Результат:
str:This
str:a
str:sample
str:string
При изменении одной и той же строки в "This| |a| |sample| |string|"
дает ожидаемый результат:
str:This
str:
str:a
str:
str:sample
str:
str:string
Как получить результат ожидания без изменения строки?
Использование std::strtok
в std::string
приведет к неопределенному поведению, поскольку std::strtok
является деструктивным (hint: std::string::c_str()
возвращает const char*
).
Вместо этого используйте std::string::find
и std::string::substr
несколько раз:
#include <iostream>
#include <string>
#include <iterator>
template <class OutputIt>
OutputIt safe_tokenizer(const std::string & s, char token, OutputIt out){
std::string::size_type pos = 0, f;
while((f = s.find(token, pos)) != std::string::npos){
*out++ = s.substr(pos, f - pos);
pos = f + 1;
}
if(pos < s.size())
*out++ = s.substr(pos);
return out;
}
int main(){
const std::string str = "Hello|World|How|Are|You";
safe_tokenizer(str, '|', std::ostream_iterator<std::string>(std::cout, "\n"));
return 0;
}
printf
? strtok
? Вы все еще кодируете в библиотеке C. And C, на самом деле не очень хорошо (в большинстве случаев) делать что-то в C++.
В C++ мы склонны избегать работы с голыми указателями, массивами C и строками C, но используйте средства STL или Boost.
Проверьте эту тему для получения полного примера "в реальном C++"
Изменение: вот еще один поток, еще лучше.
Edit2: И если вы посмотрите на правую часть этой страницы, вы можете найти столбец "Связанный" со многими полезными ссылками на ваш вопрос =)
попробуйте функцию strtok
char * TOKEN;
char * mystrtok( char * string,
const char * control)
{
char * str=NULL;
if(string == NULL)
{
str = TOKEN;
if(*str == 0)
return NULL;
}
else
str = string;
string = str;
for ( ; *str ; str++ )
{
if(*str == *control)
{
*str++ = '\0';
break;
}
}
TOKEN = str;
return string;
}
str=strtok ((char *)str.c_str(),"|");
выглядит немного странно для меня ..