Прежде всего, если доступно, я бы всегда использовал boost :: tokenizer для такого рода задач (см. И приведите лучшие ответы ниже)
Без доступа к надстройке у вас есть несколько вариантов:
Вы можете использовать C ++ std :: strings и анализировать их, используя stringstream и getline (самый безопасный способ)
std::string str = "stack+overflow*newyork;";
std::istringstream stream(str);
std::string tok1;
std::string tok2;
std::string tok3;
std::getline(stream, tok1, '+');
std::getline(stream, tok2, '*');
std::getline(stream, tok3, ';');
std::cout << tok1 << "," << tok2 << "," << tok3 << std::endl
Или вы можете использовать одну из функций семейства strtok (см. Ответ Навина для версии, не связанной с юникодом; см. Комментарии к xtofls ниже для предупреждений о безопасности потоков), если вам удобны указатели на символы
char str[30];
strncpy(str, "stack+overflow*newyork;", 30);
// point to the delimeters
char* result1 = strtok(str, "+");
char* result2 = strtok(str, "*");
char* result3 = strtok(str, ";");
// replace these with commas
if (result1 != NULL)
{
*result1 = ',';
}
if (result2 != NULL)
{
*result2 = ',';
}
// output the result
printf(str);