Ошибка в разделении strtok с использованием C ++

0

Мне нужно разбить образец строки с 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

Как получить результат ожидания без изменения строки?

  • 0
    в соответствии с ideone ваш пример приводит к ошибке во время выполнения. Вы уверены, что публикуете правильный код? str=strtok ((char *)str.c_str(),"|"); выглядит немного странно для меня ..
  • 0
    int main () {char str [] = "This | | a | | sample | | string |"; char * ptr; ptr = strtok ((char *) str, "|"); while (ptr! = NULL) {printf ("str:% s \ n", ptr); ptr = strtok (NULL, "|"); } вернуть 0; } используйте этот код
Показать ещё 3 комментария
Теги:

3 ответа

4
Лучший ответ

Использование 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;
}
1

printf? strtok? Вы все еще кодируете в библиотеке C. And C, на самом деле не очень хорошо (в большинстве случаев) делать что-то в C++.

В C++ мы склонны избегать работы с голыми указателями, массивами C и строками C, но используйте средства STL или Boost.

Проверьте эту тему для получения полного примера "в реальном C++"

Изменение: вот еще один поток, еще лучше.

Edit2: И если вы посмотрите на правую часть этой страницы, вы можете найти столбец "Связанный" со многими полезными ссылками на ваш вопрос =)

  • 0
    Если этот вопрос выглядит как дубликат, отметьте его как дубликат. Обратите внимание, что ваш «ответ» на самом деле не отвечает на вопрос.
  • 0
    @ Зета, к сожалению, моя репутация пока не так высока, чтобы ее можно было назвать дубликатом. Как вы думаете, лучше скопировать и вставить фрагменты кода из этих тем?
Показать ещё 2 комментария
0

попробуйте функцию 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;

}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню