C++中关于strtok()函数的用法

strtok:
#include <string.h>
char *strtok(char *str, const char *delim);
char *strtok_r(char *str, const char *delim, char **saveptr);
功能:分解字符串为一组标记串。str为要分解的字符串,delim为分隔符字符串。
说明:首次调用时,str必须指向要分解的字符串,随后调用要把s设成NULL。
     strtok在str中查找包含在delim中的字符并用NULL(‘/0‘)来替换,直到找遍整个字符串。
     返回指向下一个标记串。当没有标记串时则返回空字符NULL。
实例:用strtok来判断ip地址是否合法:ip_strtok.c:
[c-sharp] view plaincopy
//ip_strtok.c
#include <stdio.h>
#include <string.h>
int main(int argc, char **argv)
{
  char temp_buf[100] = {};
  char p_temp[100];
  char *p=NULL;
  char *t = ".";
  int m,n,i;
  int j=0,s=0;  

  if(argc!=2)
  {
    printf("param must 2/n");
    return -1;
  }
  strcpy(temp_buf, argv[1]);
  for(i=0; i<strlen(temp_buf);i++)
  {
    if(temp_buf[i] == *t)j++;
    if(temp_buf[i] == *t && (temp_buf[i+1]>=‘0‘&&temp_buf[i+1]<=‘9‘))
    {
      s++;
    }
  }
  if(j!=3 || j!=s)
  {
    printf("ip param format error/n");
    return -1;
  }
  p = strtok(temp_buf, t);  

  while(p!=NULL)
  {
     strcpy(p_temp, p);
     printf("%s /n", p_temp);
     for(n=0; n<strlen(p_temp);n++)
     {
       if(!(p_temp[n]>=‘0‘&&p_temp[n]<=‘9‘))
       {
         printf("ip param error/n");
         return -1;
       }
     }  

     m = atoi(p_temp);
     if(m>255)
     {
       printf("ip invalid /n");
       return -1;
     }  

     p=strtok(NULL, ".");
     printf("p = %s/n",p);
  }
  printf("ok! ip correct! ip=%s/n", argv[1]);
  return 0;
}
编译运行:
[[email protected] liuxltest]# uname -r
2.6.26
[[email protected] liuxltest]# gcc -Wall ip_strtok.c -o ip_strtok
[[email protected] liuxltest]# ./ip_strtok 172.18.4.255
172
p = 18
18
p = 4
4
p = 255
255
p = (null)
ok! ip correct! ip=172.18.4.255
[[email protected] liuxltest]# ./ip_strtok 172.18.
ip param format error
strtok实现函数:
xl_strtok.c
[c-sharp] view plaincopy
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
char *xl_strtok(char *str, const char *delim);
int main(int argc, char **argv)
{
   if(argc != 3)
   {
       printf("param must be 3 /n");
       return -1;
   }  

       char *temp;
       char *p_temp;
   char *p;
   temp=(char *)malloc(100);
   p_temp=(char *)malloc(100);
   strcpy(temp, argv[1]);
   strcpy(p_temp, argv[2]);
   printf("temp = %s /n",temp);
   printf("p_temp = %s /n", p_temp);
       p = xl_strtok(temp, p_temp);
       printf("%s/n", p);
       return 0;
}
char *xl_strtok(char *s, const char *dm)
{
       static char *last;
       char *tok;
       if(s == NULL)
               s = last;
       if(s == NULL)
               return NULL;
       tok = s;
       while (*s != ‘/0‘)
   {
               while (*dm)
       {
                       if (*s == *dm)
           {
                               *s = ‘/0‘;
                               last = s + 1;
                               break;
                       }
                       s++;
               }
       }
       return tok;
}
strtok源码:
/*********************************************************************/
/***
*strtok.c - tokenize a string with given delimiters
*
*       Copyright (c) Microsoft Corporation. All rights reserved.
*
*Purpose:
*       defines strtok() - breaks string into series of token
*       via repeated calls.
*
*******************************************************************************/
#include <cruntime.h>
#include <string.h>
#ifdef _SECURE_VERSION
#include <internal.h>
#else  /* _SECURE_VERSION */
#include <mtdll.h>
#endif  /* _SECURE_VERSION */
/***
*char *strtok(string, control) - tokenize string with delimiter in control
*
*Purpose:
*       strtok considers the string to consist of a sequence of zero or more
*       text tokens separated by spans of one or more control chars. the first
*       call, with string specified, returns a pointer to the first char of the
*       first token, and will write a null char into string immediately
*       following the returned token. subsequent calls with zero for the first
*       argument (string) will work thru the string until no tokens remain. the
*       control string may be different from call to call. when no tokens remain
*       in string a NULL pointer is returned. remember the control chars with a
*       bit map, one bit per ascii char. the null char is always a control char.
*
*Entry:
*       char *string - string to tokenize, or NULL to get next token
*       char *control - string of characters to use as delimiters
*
*Exit:
*       returns pointer to first token in string, or if string
*       was NULL, to next token
*       returns NULL when no more tokens remain.
*
*Uses:
*
*Exceptions:
*
*******************************************************************************/
#ifdef _SECURE_VERSION
#define _TOKEN *context
#else  /* _SECURE_VERSION */
#define _TOKEN ptd->_token
#endif  /* _SECURE_VERSION */
#ifdef _SECURE_VERSION
char * __cdecl strtok_s (
       char * string,
       const char * control,
       char ** context
       )
#else  /* _SECURE_VERSION */
char * __cdecl strtok (
       char * string,
       const char * control
       )
#endif  /* _SECURE_VERSION */
{
       unsigned char *str;
       const unsigned char *ctrl = control;
       unsigned char map[32];
       int count;
#ifdef _SECURE_VERSION
       /* validation section */
       _VALIDATE_RETURN(context != NULL, EINVAL, NULL);
       _VALIDATE_RETURN(string != NULL || *context != NULL, EINVAL, NULL);
       _VALIDATE_RETURN(control != NULL, EINVAL, NULL);
       /* no static storage is needed for the secure version */
#else  /* _SECURE_VERSION */
       _ptiddata ptd = _getptd();
#endif  /* _SECURE_VERSION */
       /* Clear control map */
       for (count = 0; count < 32; count++)
               map[count] = 0;
       /* Set bits in delimiter table */
       do {
               map[*ctrl >> 3] |= (1 << (*ctrl & 7));
       } while (*ctrl++);
       /* Initialize str */
       /* If string is NULL, set str to the saved
        * pointer (i.e., continue breaking tokens out of the string
        * from the last strtok call) */
       if (string)
               str = string;
       else
               str = _TOKEN;
       /* Find beginning of token (skip over leading delimiters). Note that
        * there is no token iff this loop sets str to point to the terminal
        * null (*str == ‘/0‘) */
       while ( (map[*str >> 3] & (1 << (*str & 7))) && *str )
               str++;
       string = str;
       /* Find the end of the token. If it is not the end of the string,
        * put a null there. */
       for ( ; *str ; str++ )
               if ( map[*str >> 3] & (1 << (*str & 7)) ) {
                       *str++ = ‘/0‘;
                       break;
               }
       /* Update nextoken (or the corresponding field in the per-thread data
        * structure */
       _TOKEN = str;
       /* Determine if a token has been found. */
       if ( string == str )
               return NULL;
       else
               return string;
}
时间: 2024-11-07 00:47:06

C++中关于strtok()函数的用法的相关文章

C中的时间函数的用法

C中的时间函数的用法    这个类展示了C语言中的时间函数的常用的用法. 源代码: #include <ctime>#include <iostream> using namespace std; class MyTime{public:    MyTime() { mPTime = 0; mStLocalTime = 0; mStGMTTime = 0; }    ~MyTime() {}; //time_t time(time_t * timer) 返回自1970年1月1日00

JavaScript中字符串分割函数split用法实例

这篇文章主要介绍了JavaScript中字符串分割函数split用法,实例分析了javascript中split函数操作字符串的技巧,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了JavaScript中字符串分割函数split用法.分享给大家供大家参考.具体如下: 先来看下面这段代码: <script type="text/javascript"> var str="How are you doing today?" document.write

SQL2005中row_number()等函数的用法

SQL2005中row_number()等函数的用法 今天刚装了SQL Server 2005,感觉还行,2005比2000新增了几个函数,分别是row_number().rank().dense_rank().ntile(),下面以实例分别简单讲解一下. create table gg(sname varchar(10),sort varchar(10),num int) go insert into gg select '白芍','根茎类',55 union all select '法半夏'

C语言中关于scanf函数的用法

scanf()函数的控制串 函数名: scanf 功 能: 执行格式化输入 用 法: int scanf(char *format[,argument,...]); scanf()函数是通用终端格式化输入函数,它从标准输入设备(键盘) 读取输入的信息.可以读入任何固有类型的数据并自动把数值变换成适当的机内格式. 其调用格式为: scanf("<格式化字符串>",<地址表>); scanf()函数返回成功赋值的数据项数,出错时则返回EOF. 其控制串由三类字符构成

Java中的split函数的用法

Java中的 split  函数是用于按指定字符(串)或正则去分割某个字符串,结果以字符串数组形式返回: 例如: String str="[email protected]"; String[] a = str.split("@"); System.out.println("处理结果: "+a[0]+","+a[1]);   //输出的是: 处理结果: 1234,abc 对于分割的字符(串),通常是常见,普通的,没什么问题:

mysql中的group_concat函数的用法

1 本文通过实例介绍了MySQL中的group_concat函数的使用方法,比如select group_concat(name) . 2 MySQL中group_concat函数 3 完整的语法如下: 4 group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔符']) 5 基本查询 6 mysql> select * from aa; 7 +------+------+ 8 | id| name | 9 +-

PHP 中日期时间函数 date() 用法总结

[导读] date()是我们常用的一个日期时间函数,下面我来总结一下关于date()函数的各种形式的用法,有需要学习的朋友可参考.格式化日期date() 函数的第一个参数规定了如何格式化日期 时间.它使用字母来表示日期和时间 格式化日期date() 函数的第一个参数规定了如何格式化日期/时间.它使用字母来表示日期和时间的格式.这里列出了一些可用的字母: •d - 月中的天 (01-31)•m - 当前月,以数字计 (01-12)•Y - 当前的年(四位数)您可以在我们的 PHP Date 参考手

详解Python中的join()函数的用法

函数:string.join() Python中有join()和os.path.join()两个函数,具体作用如下:     join():    连接字符串数组.将字符串.元组.列表中的元素以指定的字符(分隔符)连接生成一个新的字符串     os.path.join():  将多个路径组合后返回 一.函数说明 1.join()函数 语法:  'sep'.join(seq) 参数说明 sep:分隔符.可以为空 seq:要连接的元素序列.字符串.元组.字典 上面的语法即:以sep作为分隔符,将s

Python中的filter()函数的用法

转载自:脚本之家 Python内建的filter()函数用于过滤序列. 和map()类似,filter()也接收一个函数和一个序列.和map()不同的时,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素. 例如,在一个list中,删掉偶数,只保留奇数,可以这么写: def is_odd(n): return n % 2 == 1 filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]) # 结果: [1, 5