`
xidajiancun
  • 浏览: 492198 次
文章分类
社区版块
存档分类
最新评论

字符串分割函数---strtok和strsep函数

 
阅读更多

这几天处理字符串,突然遇到字符串分割问题,上网查了一些资料后,找到这两个函数,strtok与strsep函数。网上举的例子千篇一律,下面我根据函数的实现源码,记录一下使用说明,供大家讨论,欢迎大牛拍砖!PS:找个库函数源码的在线查询网站真不容易,先找到了这个http://sources.redhat.com/cgi-bin/cvsweb.cgi/libc/?cvsroot=glibc

之后,发现了经常去找软件的oschina有源码库,真是踏破铁鞋无觅处,得来全不费工夫!

复制代码
 1 #include <stdio.h>
 2 #include <string.h>
 3 int main()
 4 {
 5     char token[] ="abdczxbcdefgh";
 6     printf("%s\n",token);
 7     char *tokenremain = token;
 8     char *tok1 = strtok(tokenremain,"cde");
 9     printf("tok1:%s\n",tok1);
10     tok1 = strtok(NULL,"cde");                                                                          
11     printf("tok1:%s\n",tok1);
12     return 0;
13 }
复制代码
[root@ test]# ./strtok 
abdczxbcdefgh
tok1:ab
tok1:zxb

总结:strtok内部记录上次调用字符串的位置,所以不支持多线程,可重入版本为strtok_r,有兴趣的可以研究一下。它适用于分割关键字在字符串之间是“单独”或是 “连续“在一起的情况。

复制代码
 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 int main()
 5 {
 6     char token[] ="abdzxbcdefgh";
 7     printf("%s\n",token);
 8     char *tokenremain = token;
 9     char *tok1 = strsep(&tokenremain,"cde");
10     printf("tok1:%s,token:%s\n",tok1,tokenremain);
11     tok1 = strsep(&tokenremain,"cde");                                                                  
12     printf("tok1:%s,token:%s\n",tok1,tokenremain);
13     return 0;
14 }
复制代码
[root@ test]# ./strsep 
abdzxbcdefgh
tok1:ab,token:zxbcdefgh
tok1:zxb,token:defgh

总结:strsep返回值为分割后的开始字符串,并将函数的第一个参数指针指向分割后的剩余字符串。它适用于分割关键字在两个字符串之间只严格出现一次的情况。

所以通过阅读函数实现源码,可以灵活运用这两个函数,为自己所用!

PS:因为函数内部会修改原字符串变量,所以传入的参数不能是不可变字符串(即文字常量区)。

如 char *tokenremain ="abcdefghij"//编译时为文字常量,不可修改。

strtok(tokenremain,"cde");

strsep(&tokenremain,"cde");

编译通过,运行时会报段错误。

在使用strtok()的时候,可以发现,在分割标志的时候,并不是一个全部匹配:

  1 #include<string.h>
  2 #include<stdio.h>
  3 int main(void)
  4 {
  5     char input[16]="zhong  guo ren";
  6     char *p;
  7     p=strtok(input," \n");
       // p=strtok(input," \n");

8 while(p) 9 { 10 printf("%s\r\n",p); 11 p=strtok(NULL," \n"); 12 } 13 return 0; 14 }~ ~

如果将第七行该为下面注释的一行,那么不可以将三个单词分析分开来

但是如果是第七行修改而11行不修改 运行结果就知道是怎么个情况了!!!!

分享到:
评论

相关推荐

    C语言字符串各函数-具体实现

    strcpy,strncpy,strcat,strncat,strcmp,strncmp,strchr,strnchr,strlen,strnlen,strspn,strpbrk,strtok,strsep,memset,bcopy,memcpy,memmove,memcmp,memscan,strstr,memchr.函数具体实现内容。对理解C语言和C编程有...

    C语言分隔字符串函数接口strsep

    C语言分隔字符串函数接口strsep int strsep(char* line, char* lines[MAXSUBSTR], char* delim) 利用strtok实现

    c语言字符串分割函数strtok

    这个例子从文本文件ad9361.txt一行一行读取数据,通过spi设置寄存器值。支持命令读写:spidev_test -r F1 -w A0,-r参数表示寄存器地址,-w表示要写入的值,均为16进制(不要加0x开头)

    使用strtok函数截取字符串得到相应的子串存入数组中

    在C/C++编程中,`strtok`函数是一种常用的字符串处理工具,用于将字符串分割成多个子串。这个函数在处理复杂格式的数据时非常有用,比如解析包含多种数据类型的字符串。在给定的场景中,我们需要从一个字符串中提取...

    c语言中字符串分割函数及实现方法

    1、问题引入 自己在写一个linux下的模拟执行指令...2、自己写的字符串分割函数:用于分割指令,比如cat a.c最后会被分割成cat和a.c两个字符串、mv a.c b.c最后会被分割成mv和a.c和b.c三个字符串。 具体实现如下: #inc

    Linux 常用C函数(中文版).rar

    Linux下的C函数库,主要基于POSIX标准和GNU C Library(glibc),包含了大量功能各异的函数,如输入/输出操作、内存管理、字符串处理、数学运算、时间日期处理等。以下是一些重要的C函数类别及其详解: 1. **输入/...

    Linux系统调用快速参考

    - **`strtok()`**: 以指定分隔符分割字符串,并返回第一个字段。 #### 文件输入输出 文件操作是几乎所有应用程序的基础功能之一,C语言提供了丰富的文件处理API。 - **`fopen()`**: 打开或创建文件。支持多种模式...

    c代码-分割字符串

    5. **替代方案**:如果你不希望修改原始字符串,可以考虑使用`strsep()`函数,或者使用`strspn()`和`strcspn()`组合来实现自定义的字符串分割。 6. **扩展应用**:字符串分割在许多场景下都很实用,例如处理用户...

    tsc.rar_The Next_gettok

    在C语言中,标准库没有提供直接的gettok函数,但可以使用strtok或者fgets结合strsep等函数来实现类似功能。gettok可能有自己的特定规则来决定分隔符和如何处理连续的分隔符。 3. **源代码文件**: - `pp_mlaa_area...

    目录路径压栈出栈 C 语言源码.zip_C语言压栈代码_C语言源码_site:www.pudn.com

    为了处理目录路径,我们还需要额外的逻辑来分割路径字符串,这通常可以通过 `strtok` 或 `strsep` 函数来实现。 在提供的压缩文件中,`DSTACK` 可能是实现这种栈操作的C源代码文件,它包含了上述函数的具体实现。`...

    linux线程的实现 - aitao - 博客园1

    另外,`strsep`和`strtok_r`是C语言中用于字符串分割的函数,它们提供了一种更安全的方式来替代可能导致内存问题的`strtok`。 【缓存策略】 在软件设计中,缓存穿透是指查询一个不存在的数据,导致缓存和数据库都...

    c语言实现的tsv文件读取源代码

    3. 数据解析:由于TSV文件是用制表符分隔的,我们可以使用`strtok()`或`strsep()`函数,将每行数据分割成多个字段。这些函数会使用指定的分隔符(这里是制表符)来切割字符串。 4. 内存管理:在读取过程中,需要...

    ( 嵌入式系统 linux工程师 面试题

    14. `strtok`在使用时需要注意,它会修改原字符串,且不支持连续调用。若要处理多个分隔符,可以考虑使用`strsep`。 15. `gets`函数已废弃,因为它可能导致缓冲区溢出,应使用更安全的`fgets`代替。 16. C语言的词法...

    Modern-Periodic-Table-hash-maps:使用其属性或名称本身查找任何元素

    在C语言中,处理CSV文件通常会涉及到文件I/O操作,比如使用fopen()打开文件,fgets()读取每一行,strtok()或strsep()分割字符串。解析后的数据将被传递给哈希表,进行存储。哈希表的实现可能基于链表、开放寻址或者...

    c高级实用程序设计

    10. **标准库高级功能**:深入研究C标准库中的高级函数,如`strtok`、`strptime`、`strsep`等,以及`math.h`、`time.h`等头文件中的复杂功能。 在学习过程中,读者会遇到许多示例代码和练习题,这些都是为了巩固...

    minishell

    这通常涉及到字符串处理函数,如`fgets()`来获取用户输入,`strtok()`或`strsep()`来分割命令和参数。理解词法分析和语法分析的概念对实现这一部分至关重要。 2. **环境变量**:minishell需要维护一个环境变量表,...

    minishell_main

    C语言中的字符串处理函数如`strtok()`和`strsep()`在此处发挥作用,将命令行输入分解为可操作的部分。 2. **命令执行**:解析后的命令和参数将被传递给`execve()`系统调用,以启动或替换当前进程的执行体。`execve...

    minishell:创建一个简单的外壳

    这通常通过调用`strtok()`或`strsep()`等字符串处理函数实现。例如,`ls -l`会被解析成`ls`作为命令,`-l`作为参数。 2. **进程创建**:解析完命令后,我们需使用`fork()`系统调用来创建一个新的进程,然后使用`...

Global site tag (gtag.js) - Google Analytics