токенайзер строк в с ++ - PullRequest
       14

токенайзер строк в с ++

1 голос
/ 27 марта 2011

Здравствуйте, у меня есть код,

char * cip = "192.168.0.1\t\t78.90.56.4";

Я хочу преобразовать его в

char * ip1= "192.168.0.1";
char * ip2 = "78.90.56.4";

Я сделал

 ip1= strtok(cip, "\t\t ");

Я незнаю, как получить второй IP

Я не знаю, как это сделать с помощью строкового токенизатора.пожалуйста, помогите мне спасибо

Ответы [ 5 ]

5 голосов
/ 27 марта 2011

strtok пытается изменить любую строку, которую вы передаете ей.Изменение строкового литерала вызывает неопределенное поведение.Поскольку вы передаете строковый литерал в strtok, ваш код имеет неопределенное поведение.

Я бы, вероятно, сделал что-то вроде этого:

std::istringstream cip(""192.168.0.1\t\t78.90.56.4");

std::string ip1, ip2;

std::getline(cip, ip1, '\t');
std::getline(cip, ip2);

Или, поскольку адреса разделеныпо единственному пробелу в строке вы можете просто использовать:

cip >> ip1 >> ip2;

В любом случае, это определило поведение.В качестве бонуса, это не вызывает проблем, когда / если вы используете несколько потоков (что часто делает strtok).

2 голосов
/ 27 марта 2011

Попробуйте эту функцию:

ip2 = strtok(NULL, "\t\t");
1 голос
/ 12 декабря 2012

Вы можете передать NULL на strtok_s, чтобы получить второй предмет:

char * context=NULL;
char cip[100] = "192.168.0.1\t\t78.90.56.4";
char * ip1= strtok_s(cip,"\t\t",&context);
char * ip2=  strtok_s(NULL,"\t\t",&context);
1 голос
/ 29 апреля 2012

http://www.cplusplus.com/reference/clibrary/cstring/strtok/

char * strtok (char * str, const char * delimiters);

Разделение строки на токены Последовательность вызовов этой функции разбивает str на токены, которые являютсяпоследовательности смежных символов, разделенных любыми символами, являющимися частью разделителей.

При первом вызове функция ожидает строку C в качестве аргумента для str, первый символ которого используется в качестве начального местоположения для поискажетоны.При последующих вызовах функция ожидает нулевой указатель и использует позицию сразу после конца последнего токена в качестве нового начального местоположения для сканирования.

Чтобы определить начало и конец токена, функция сначала сканируетот начальной позиции для первого символа, не содержащегося в разделителях (который становится началом токена).А затем сканирует, начиная с этого начала токена, для первого символа, содержащегося в разделителях, который становится концом токена.

Этот конец токена автоматически заменяется нулевым символом функцией, иначало токена возвращается функцией.

Как только в вызове strtok найден завершающий нулевой символ str, все последующие вызовы этой функции с нулевым указателем в качестве первого аргумента возвращают нулевойуказатель.

Параметры

str C строка для усечения.Содержимое этой строки модифицируется и разбивается на более мелкие строки (токены).В качестве альтернативы, нулевой указатель может быть указан, и в этом случае функция продолжает сканирование после завершения предыдущего успешного вызова функции.разделители C строка, содержащая разделители.Они могут варьироваться от одного вызова к другому.

Возвращаемое значение Указатель на последний токен, найденный в строке.Пустой указатель возвращается, если для извлечения не осталось токенов.

..... для продолжения ....

/* strtok example */
#include <stdio.h>
#include <string.h>

int main ()
{
   char str[] ="- This, a sample string.";
   char * pch;
   printf ("Splitting string \"%s\" into tokens:\n",str);
   pch = strtok (str," ,.-");
   while (pch != NULL)
   {
     printf ("%s\n",pch);
     pch = strtok (NULL, " ,.-");
   }
   return 0;
}  
0 голосов
/ 27 марта 2011

См. Пример внизу этой страницы .По сути, вы делаете второй вызов strtok с NULL вместо первого параметра char *.Все разделители упакованы в этот второй параметр, поэтому я думаю, что наличие \ t \ t избыточно, вам может потребоваться дополнительный вызов strtok для очистки второго '\ t'.

...