收录日期:2020/06/02 20:09:33 时间:2016/06/12 02:12:12 标签:C语言
我有一段程序:
       #include <string.h>
      #include <stdio.h>

      main()
      {
        char *s="Golden";
        char *d="u";
        char *p;
        
        p=strtok(s,d);
        while(p)
        {
          printf("%s\n",s);
        }

       }

不是说找不到字符串的时候是返回NULL吗??
怎么结果仍然是“Golden”呀?
不应该吧
找不到就返回整个字符串,我用的时候也是这样的
原型:extern char *strtok(char *s, const char *delim);
        
  用法:#include <string.h>
  
  功能:分解字符串为一组标记串。s为要分解的字符串,delim为分隔符字符串。
  
  说明:首次调用时,s必须指向要分解的字符串,随后调用要把s设成NULL。
        strtok在s中查找包含在delim中的字符并用NUL('\0')来替换,直到找遍整个字符串。
        返回指向下一个标记串。当没有标记串时则返回空字符NULL。

===========================
所说的“当没有标记串时则返回空字符NULL”意思应该是串分解全部完成的时候

另外我记得空字符应该是NUL不是NULL。。。
一个L的NUL用于結束一個ASCII的字符串。

兩個L的 NULL用于表示什么也不指向(空指針)。
函数名称:     strtok
函数原型:     char *strtok(char *s1, const char *s2)
函数功能:    分解s1字符串为用特定分隔符分隔的多个字符串(一般用于将英文句分解为单词)
函数返回:     字符串s1中首次出现s2中的字符前的子字符串指针
参数说明:     s2一般设置为s1中的分隔字符
              规定进行子调用时(即分割s1的第二、三及后续子串)第一参数必须是NULL
              在每一次匹配成功后,将s1中分割出的子串位置替换为NULL(摘下链中第一个环),因此s1被破坏了
              函数会记忆指针位置以供下一次调用
              
所属文件:     <string.h>

#include <string.h>
#include <stdio.h>
int main()
{
    char *p;
    char *buffer;
    char *delims={ " .," };

    buffer=strdup("Find words, all of them.");
    printf("%s\n",buffer);
    p=strtok(buffer,delims);
    while(p!=NULL){
      printf("word: %s\n",p);
      p=strtok(NULL,delims);
    }
    printf("%s\n",buffer);
    return 0;
}
p=strtok(s,d);
        while(p)
        {
          printf("%s\n",s);
          p=strtok(NULL, d);  //没有这个语句,p都不变化,怎么可能结束循环 ...
        }
在每一次匹配成功后,将s1中分割出的子串位置替换为NULL(摘下链中第一个环),因此s1被破坏了
-----------

那么s1聲明定義時應該用char s1[];了。
谢谢大家,我是新来的,我只是尝试看有没有人回我,没想到这么多,真是开心呀,谢谢大家的帮助,以后多多交流
程序就是根据指定的 char *delims={ " .," }; 做字符串的分割,
delims 定义的是分割符号 的集合。
不过感觉奇怪的是

第一次如果没搜索到,应该返回NULL的

就不应该继续执行if下面的语句了。。。

但是。。。
完。。
虫子一进来,
分8成被他拿走。
我真不知道csdn的分有啥用处,
否则一定跟虫子赛一赛
就算弄不过虫子。
至少能把 Chiyer(星羽) 比下去。

不过我觉得分没什么用处
搞那么多分没多大意思。。。
所以。。。
呵呵  我基本明白了  谢谢大家

在vs.net上做的ASP。ENT程序为什么发布到WIN2003上就无法显示///急!! 菜鸟必读3:怎樣生成java的可執行文件?(欢迎收藏) 请问哪里有VC 6.0 编译器下载? 如何调用自已新建的类 请教大家在asp.net中,如何将datareader绑定到datagrid中呢? 招聘DELPHI程序员,工作地点:上海 急急急~~~~~~~~~急急~~~~~~~ 一个数据窗口对应了两个表,如何实现同时更新啊? VFP中有没有办法得到系统缺省打印机的名称? 动态使用dll时如何传入函数参数? 测试我的信誉分 在win2000下,usb的驱动程序也没问题,系统提示usb设备运作正常,但插入U盘,总是不见有弹出“即插即用”那个窗口,也没显示U盘的盘符! SQL实例无法与数据库 关于JBUILDER9的问题 在线程中为控件添加子控件的问题 俺是初学者,求救!读写文件 RXLib中的memorytable怎么用 今天生日,散分,大家进来吧,见者有份 如何给datagrid的特定cell写入指定信息 运行java程序出错! 请问在VB下如何用ado连接访问access数据库?急! 做为本版的一个版主我不能不管,希望广大网友参于 如何获取oracle中存储过程的参数列表 有没有谁有类似vc中的智能感应的实现方法? 这个语句在javascript中怎么写? j2sdkee-1_3_1-win.exe 怎么用 请指教 一二 有关jsvascript跨frame的问题 请问:在linux中有拷贝文件的函数吗? 我在一个网站上看到一个投票系统,投完票后就能出现一个柱状图动态现实当前票数,请问如何实现呢? Win2k Server是不是对游戏有什么限制啊~~~~~~~~~~~~~???(高分请教,Up者有分)