strtok
char *strtok(char *str, const char *delim);
- str: 要分词的字符串。在首次调用时,此参数应指向欲分解的字符串。在后续的调用中,为了获取其他的标记,这个参数应当为 NULL。
- delim: 分隔符
- 返回值:
-如果找到delim,则返回指向该标记的指针。
如果没有找到delin, 则返回原字符串
如果传入的字符串为空串,如 char str[] = {0} ; // char str[] = “” , 则返回NULL
如果第一次传入str值不为空,后续使用str为空,当str为空串的时候,返回NULL
实例
字符串1:“sip:172.16.30.34:5060”
字符串2:“sip:111172.16.30.34:5060”
字符串1 返回正确,字符串2 返回错误
判断sip:之后为ip地址,则返回正确; 若sip:之后有号码111, 之后为ip地址,则返回错 。
注意
- strcpy 正确拷贝,目的字符串要使用字符数组,不能使用未初始化的指针或者空指针
- strtok 分割字符后成功后,源字符串(第一个参数)发生改变,为分割之后的字符串,若之后再次执行strtok函数,如果需要保存,则进行拷贝
#include <stdio.h>
#include <string.h>
int main()
{
char string[50] = "sip:172.16.30.34:5060";
char *tmp;
char *ip_addr = NULL;
char ip_addrBack[32] = "";
//char *ip_addrBack; // core dump 的原因 , ip_addrBack的指针未知,不知道是否可写, 要么手动申请空间,要么使用字符数组
char *ip_first = NULL;
tmp = strtok(string, ":");
if(tmp != NULL)
{
ip_addr = strtok(NULL, ":");
if(ip_addr != NULL)
{
strncpy(ip_addrBack,ip_addr,sizeof(ip_addrBack)-1);
ip_addrBack[sizeof(ip_addrBack) - 1] = '\0';
ip_first = strtok(ip_addr, ".");
if(ip_first != NULL)
{
if(strlen(ip_first) == 3)
{
printf("success\n");
return 1;
}
}
}
}
else
{
printf("error\n");
return -1;
}
}