你好,我有一个
的代码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
我不知道如何使用字符串标记器来完成此操作。请帮助我谢谢
答案 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'。