c ++中的字符串标记生成器

时间:2011-03-27 07:44:32

标签: c++ string tokenize

你好,我有一个

的代码
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 个答案:

答案 0 :(得分:5)

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经常会这样做),它不会导致问题。

答案 1 :(得分:2)

尝试此功能:

ip2 = strtok(NULL, "\t\t");

答案 2 :(得分:1)

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;
}  

答案 3 :(得分:1)

您可以将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);

答案 4 :(得分:0)

请参阅this page底部的示例。基本上,您使用NULL代替第一个char *参数再次调用strtok。分隔符都包含在第二个参数中,因此我认为“\ t \ t \ t”是多余的,您可能需要额外调用strtok来清除第二个'\ t'。