字符串(高级)
1.       查找一个字符串的前缀 (strspn().strcspn())
这两个函数用于在字符串的起始位置.并且对该字符串进行计数.
函数原型:
-- à size_t strspn(char const * str,char const * group);
-- à size_t strcspn(char const * str,char const * group);
参数说明:
group 指定一个或者多个字符.
str 为目标的字符串.
对于strspn() 返回一str起始位置部份匹配的group中任意字符的字符数.如果group包含空字符.制表符等空白字符.那么这个函数将返回str起始部份的空白字符的数目.str的下一个字符就是它的第一个非空白字符.
-- à int len1,len2;
char buffer[]=”25,142,332,smith,J,239-4123”;
len1=strspn(buffer, “0123456789”);
len2=strcspn(buffer, “.0123456789”);
代码段说明:
buffer 缓冲区在正常的情况下是不会对这个方法进行初始化的.它将会包含运行时读取数据操作.但是在buffer中有了这个值之后.变量len1将会被设置为2.变量len2将会被设置为11.
-- à ptr=buffer+strspn(buffer , “\n\r\f\t\v”);// 此句代码将计算一个指向字符串中第一个非空字符的指针.
strcspn() strspn()相反.它对str字符串起始部份中不与group中任何字符匹配的字符计算数.
strcspn() 中的c字母来源于对一组字符中的字符求补的概念.也就是把这字符换成原先并不存在的字符.
若使用”\n\r\f\t\v”作为group参数.这个函数将返回第个参数字符串起始位置部份用所有非空白字符的值.
2.       查找标记(strtok())
引函数将从字符串中隔离各个单独的称为标记(token)的部份.并丢弃分隔符.
函数原型:
-- à char * strtok(char * str , char const * sep);
参数说明:
sep 是个字符串.定义用作分隔符的字符集合.第一个参数指定一个字符串.它包含零个或多个由sep的字符串中一个或多个分隔符分隔的标记.strtok找到str的下一个标记.并将其用NULL结尾.返回一个指定的这个字符的指针.
注意:如果使用strtok时会修改原字符串.如果源字符串不可以被修改.则不能使用该函数.
如果strtok()函数的第一个参数不是NULL;函数将找到该字符串的第一个标记..strtok同时保存它在字符串中的位置.如果strtok第一个参数是NULL; 函数就在同一个字符串中从这个被保存的位置开始像前面一样查找下一个标记.若字符串内不存在更多的标记.strtok就会返回NULL;
在典型的情况下.在第一次调用strtok函数.向它传递一个指向字符串的指针.然后重复调用strtok直到它返回为NULL;
-- à
#include
#include
void print_tokens(char * line)
{
      static char whitespace[ ]=”\t\f\r\v\n”;
      char * token;
       for(token=strtok(line,whitespace);
token!=NULL;
token=strtok(NULL,whitespace))
      {
             printf(“Next token is %s \n”,token);
      }
}
由于strtok保存的时候是局部的信息.不可以对两个字符串同时解析.如果在for中调用strtok().程序会失败.
例题:
由自己编写一个函数my_strcpy_end取代strcpy
-- à 它返回一个指向目标字符串未尾的指针.即指向NUL字节的指针.而不是返回一个指向目标字符串起始位置的指针.
-- à 第一种方法:
#include
#include
char * my_strcpy_end(char * dst ,char src)
{
       strcpy(dst,src);
       return dst+strlen(dst);
}
第二种方法:
#include
#include
char * my_strcpy_end(register char * dst,register char * src)
{
      while((* dst ++=* src++)!=’\o’)
        ;
      return dst-1;
}
-- à   这两种方法都是返回一个指向目标参数的未尾的指针
// 第二个例子
功能:
计算机标准输出”the”字的次数.字母区分大小写.The .THE.都不在计算的范围内.输入中的单词由**一个或多次空白字符分隔
#include
#include
#include
using namespace std;
 
char const whitespace[]="\n\r\f\t\v";
int _tmain(int argc, _TCHAR* argv[])
{
     char buffer[101];
     int count;
     // 读入文本.直到EOF
     while(gets(buffer))
     {
         char * word;
         // 从缓冲区中逐个提取单词.直到不再有单词.
         for(word=strtok(buffer,whitespace);word!=NULL;word=strtok(NULL,whitespace))
         {
              if(strcmp(word,"the")==0)
              {
                   count+=1;
              }
         }
     }
     cout<
     system("pause");
     return EXIT_SUCCESS;
}// visual studio 2005下编译通过