strok函数的使用

strok函数的使用转自 https blog csdn net comeonwpk article details 找不到原创博文 在编程过程中 有时需要对字符串进行分割 而有效使用这些字符串分隔函数将会给我们带来很多的便利 下面我将在 MSDN 中学到的 strtok 函数做如下翻译 strtok 在一个字符串查找下一个符号 char strtok char strToken cons strok 函数

转自strok函数的使用  (找不到原创博文)

在编程过程中,有时需要对字符串进行分割.而有效使用这些字符串分隔函数将会给我们带来很多的便利.

下面我将在MSDN中学到的strtok函数做如下翻译.

  strtok :在一个字符串查找下一个符号

char *strtok( char *strToken, const char *strDelimit );

返回值:返回指向在strToken字符串找到的下一个符号的指针,当在字符串找不到符号时,将返回NULL.每

次调用都通过用NULL字符替代在strToken字符串遇到的分隔符来修改strToken字符串.

strDelimit:分隔符集合

注:第一次调用strtok函数时,这个函数将忽略间距分隔符并返回指向在strToken字符串找到的第一个符

号的指针,该符号后以NULL字符结尾.通过调用一系列的strtok函数,更多的符号将从strToken字符串中分

离出来.每次调用strtok函数时,都将通过在找到的符号后插入一个NULL字符来修改strToken字符串.为了

读取strToken中的下一个符号,调用strtok函数时strToken参数为NULL,这会引发strtok函数在已修改过

的strToken字符串查找下一个符号.

Example(摘自MSDN)

/* STRTOK.C: In this program, a loop uses strtok
 * to print all the tokens (separated by commas
 * or blanks) in the string named "string".
 */

char string[] = "A string\tof ,,tokens\nand some  more tokens";
char seps[]   = " ,\t\n";
char *token;

void main( void )
{
   printf( "%s\n\nTokens:\n", string );
   /* Establish string and get the first token: */
   token = strtok( string, seps );
   while( token != NULL )
   {
      /* While there are tokens in "string" */
      printf( " %s\n", token );
      /* Get next token: */
      token = strtok( NULL, seps );
   }
}

Tokens:
 A
 string
 of
 tokens
 and
 some
 more

 tokens

以下转自strok函数的使用

函数原型:char *strtok(char *s, char *delim);

函数功能:把字符串s按照字符串delim进行分割,然后返回分割的结果。

函数使用说:

1.strtok函数的实质上的处理是,strtok在s中查找包含在delim中的字符并用NULL(’/0′)来替换,直到找遍整个字符串。这句话有两层含义:(1)每次调用strtok函数只能获得一个分割单位。(2)要获得所有的分割单必须反复调用strtok函数。

2.strtok函数以后的调用时的需用NULL来替换s.

3.形参s(要分割的字符串)对应的变量应用char s[]=”….”形式,而不能用char *s=”….”形式。

例子如下:

#include <stdio.h> 

#include <string.h>

int main(void)

{

      char buf[]=”Golden Global View”;

      char* token = strtok( buf, " ");

      while( token != NULL )

      {

           printf( ”%s “, token );

           token = strtok( NULL, ” “);

      }

      return 0;

}

其结果为:

Golden

Global

View

 

但是如果我们把char buf[]=”Golden Global View”;换成char *buf=”Golden Global View”; 则会出错,原因是如果分配的大小一样的前提下char *p和char b[]也是有区别的,
char *p="abc";
char b[]="abc";
当这两个语句编译后,编译器会将“abc”放在常量区中,而strtok(char *s, char *delim)函数是在s中查找包含在delim中的字符并用NULL(’/0′)来替换,直到找遍整个字符串。这句话就能体现指针和数组的区别:既然查找就要p++/b++。 要替换成(‘/0’),那么就要对*p/*b赋值
*p='/0';
*b='/0';
p指针是指向常量字符串的,对*p操作就是对字符串操作,这显然会编译不通过的。
b是字符数组的首地址,这个数组里面的素是‘a’、'b'、'c'、'/0',和字符串“abc”看上去是一样,不过并不是同一个。相当于,b数组里可以存放其他东西'1'、'2'、'3'、'/0',只不过在编译到char b[]="abc";后给这个b数组里的素值改变了,所以对*b的操作并不影响字符串。

如果我们把token = strtok( NULL, ” “);换成token = strtok( buf, " ");则while循环会成为一个无限循环,而输出的结果就只为:Golden。我的解释原因如下: 在strtok函数体中有一个char 类型的指针(假设为 char *p),它的作用就是令p=s,用于保存s的起始地址。由于在随后的处理中指针p的值会一直保存(C语言中指针的特点),因此在以后的strtok调用中用NULL来代替s的原因就是防止p被重新赋值而指向s的起始地址,从而可以保证p可以指向s的其他位置,直到最后分割完整个字符串。 但是如果用s来代替NULL,那么每次调用strtok时,p就会指向s的初始地址,从而只能获得第一个分割出来的字串,如上面的例子中while会是一个无限循环,而输出的结果只能是“Golden”。


今天的文章 strok函数的使用分享到此就结束了,感谢您的阅读。
编程小号
上一篇 2024-12-31 20:33
下一篇 2024-12-31 20:30

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ji-chu/97594.html