сбой программы strtok - PullRequest
       9

сбой программы strtok

3 голосов
/ 16 мая 2010

программа для стрток, заданная на http://www.opengroup.org/onlinepubs/000095399/functions/strtok.html вылетает каждый раз ..

#include <string.h>
...
char *token;
char *line = "LINE TO BE SEPARATED";
char *search = " ";


/* Token will point to "LINE". */
token = strtok(line, search);


/* Token will point to "TO". */
token = strtok(NULL, search);

Если я использую массив символов для переменной 'line', это работает. то есть char line [] = "LINE TO SEPARATED" работает.

Пожалуйста, объясните.

Ответы [ 4 ]

8 голосов
/ 16 мая 2010

strtok изменяет строку ввода line.

char *line = "LINE TO BE SEPARATED";

В этом случае line указывает на постоянную память. Следовательно, не может быть изменено. Вам нужно передать массив символов для strtok.

2 голосов
/ 16 мая 2010

char *line - указатель, и вы указываете его на постоянную строку ("LINE TO BE SEPARATED"). Это терпит неудачу, когда strtok пытается изменить эту строку. Было бы лучше квалифицировать эту переменную как const char *line - она ​​все равно не будет работать, но может привести к полезному предупреждению при попытке передать ее в strtok.

Между тем массив char line[] может быть изменен (это не const) и только инициализируется, чтобы содержать строку.

2 голосов
/ 16 мая 2010

Так как это имеет тег C ++:

// Beware, brain-compiled code ahead!
#include <string>
#include <sstream>
#include <iostream>

int main()
{
  std::istringstream iss("LINE TO BE SEPARATED");
  while( iss.good() ) {
    std::string token;
    iss >> token;
    std::cout << token '\n';
  }

  return 0;
}

Редактировать: Как сказал Конрад в своем комментарии, вышеприведенный цикл можно заменить на std::copy, работающий с потоковыми итераторами:

// Beware, brain-compiled code ahead!
#include <string>
#include <sstream>
#include <iostream>
#include <algorithm>

int main()
{
  std::istringstream iss("LINE TO BE SEPARATED");
  std::copy( std::istream_iterator<string>(std::iss)
           , std::istream_iterator<string>()
           , std::ostream_iterator<string>(std::cout, "\n") );
  return 0;
}

Я должен (неохотно) признать, что есть, что сказать по этому поводу.

1 голос
/ 16 мая 2010

AJ сказал, что нужно. Мой совет - избегайте этого уродливого и небезопасного strtok. Вы используете C ++, так что продолжайте с std :: string. Вы также можете использовать Boost http://www.boost.org/doc/libs/1_43_0/libs/libraries.htm#String & http://www.boost.org/doc/libs/1_43_0/doc/html/string_algo.html. Если вы хотите новый класс строки, вы можете посмотреть на http://bstring.sourceforge.net/.

...