c,c++中字符串处理函数strtok,strstr,strchr,strsub
http://blog.csdn.net/wangqing_12345/article/details/51760220
1,字符串切割函数
函数原型: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”。
2,字符串中查找字串
strstr()函数用来检索子串在字符串中首次出现的位置,其原型为:
char *strstr( char *str, char * substr );
【参数说明】str为要检索的字符串,substr为要检索的子串。
【返回值】返回字符串str中第一次出现子串substr的地址;如果没有检索到子串,则返回NULL。
【函数示例】strstr()函数的使用。
- #include<stdio.h>
- #include<string.h>
- int main(){
- // 也可以改成 char str[] = "http://see.xidian.edu.cn/cpp/u/xitong/";
- char *str = "http://see.xidian.edu.cn/cpp/u/xitong/";
- char *substr = "see";
- char *s = strstr(str, substr);
- printf("%s\n", s);
- return 0;
- }
运行结果:
see.xidian.edu.cn/cpp/u/xitong/
3,查找字符在字符串中首次出现的位置
strchr() 用来查找某字符在字符串中首次出现的位置,其原型为:
char * strchr (const char *str, int c);
【参数】str 为要查找的字符串,c 为要查找的字符。
strchr() 将会找出 str 字符串中第一次出现的字符 c 的地址,然后将该地址返回。
注意:字符串 str 的结束标志 NUL 也会被纳入检索范围,所以 str 的组后一个字符也可以被定位。
【返回值】如果找到指定的字符则返回该字符所在地址,否则返回 NULL。
返回的地址是字符串在内存中随机分配的地址再加上你所搜索的字符在字符串位置。设字符在字符串中首次出现的位置为 i,那么返回的地址可以理解为 str + i。
提示:如果希望查找某字符在字符串中最后一次出现的位置,可以使用 strrchr() 函数。
【实例】查找字符5首次出现的位置。
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- int main(){
- char *s = "0123456789012345678901234567890";
- char *p;
- p = strchr(s, '5');
- printf("%ld\n", s);
- printf("%ld\n", p);
- system("pause");
- return 0;
- }
输出结果:
12016464
12016469
4,获取字符串指定位置间的字符串
str.substr(startpos, length);
其中 startpos 是起始字符的序号,length 是[从 startpos 开始]取的字符串长度(包括
startpos )。
如果要取得 str 中序号 m 到 n 之间(不包括n)的子字符串需要用
str.substr(m, n-m);
#include<string>
#include<iostream>
using namespace std;
main()
{
string s("12345asdf");
string a=s.substr(0,4); //获得字符串s中 从第0位开始的长度为4的字符串
cout<<a<<endl;
}
输出结果为:
1234
c,c++中字符串处理函数strtok,strstr,strchr,strsub相关推荐
- C语言字符串处理的一些函数strok,strstr, strchr,strsub
字符串切割函数 函数原型:char *strtok(char *s, char *delim); 函数功能:把字符串s按照字符串delim进行分割,然后返回分割的结果. 函数使用说: 1.strtok ...
- oracle 字符转整数,Oracle中字符串转换函数小数转法
Oracle中字符串转换函数小数转法 类别:Oracle数据库 作者:码皇 来源:薛凯博客 点击: Oracle中字符串转换函数小数转法 to_char()函数的字符串转换格式归纳如下 ...
- mysql sql字段切割_sqlserver中字符串切割函数总结
本文章收藏了大量的在sqlserver中字符串切割函数,包括了自用自定义函数或sql带带的函数来操作,有需要了解的同学可参考一下 实例1 循环while一个个读取 代码如下 复制代码 ALTER FU ...
- c语言中接收字符串函数,C语言中字符串处理函数拾锦
之前在学习C语言的时候,知道C语言库函数中有很多字符串处理函数,但是没怎么好好利用它.最近,发现它们的作用实在太大了,而且有些是我从来都没有用过的.今天想整理一下,方便以后使用.比较容易理解的,就没有 ...
- 字符串切割函数strtok、strtok_s、strtok_r的区别
strtok函数 头文件:#include <string.h> 函数原型:char * strtok (char *str, const char * delimiters); 参数:s ...
- C语言字符串截取函数strtok和strtok_r
在看源码的时候需要将一段并排的IPs转化成为一系列的IP,将"10.0.0.1;10.0.0.2;10.0.0.3;10.0.0.4;10.0.0.5"转换成为单独的"1 ...
- 字符串分割函数strtok和strsep使用注意事项
转载自 https://blog.csdn.net/astrotycoon/article/details/50813959 为什么写本文 最近工作中经常需要解析字符串,并且这些字符串都有一个共同的特 ...
- 字符串分割函数--strtok与strsep
在c/c++中,字符串分割函数主要有两种:一是strtok函数,另一个就是strsep函数.下面我们对这两个函数作一个详细解释说明. 1.strtok 原形: char* strtok(char *s ...
- Python中字符串操作函数string.split('str1')和string.join(ls)
Python中的字符串操作函数split 和 join能够实现字符串和列表之间的简单转换, 使用 .split()可以将字符串中特定部分以多个字符的形式,存储成列表 1 def split(self, ...
最新文章
- ddos攻击python_Python基于http的ddos攻击代码
- 直播源码:直播+内容营销新趋势
- 测试常用shell语句——数值,数组类型;函数创建
- ORB-SLAM2中生成金字塔提取FAST角点和计算BRIEF描述子
- php中的id怎么传值,uniapp如何跳转页面传值
- 将ubuntu配置为路由器_“名酒为王”时代来临但资源将尽,看泸州老窖如何进行“名酒资源再配置”丨深度观察...
- 云上虚拟IDC(私有池)如何为客户业务的确定性、连续性保驾护航
- Hadoop之HDFS的edits和fsimage查看器
- sql 2000 无法连接远程数据库 sqlserver不存在或访问被拒绝、不能打开到主机的连接,在端口1433:连接失败等 解决方案
- 大幅提高Android开发效率之TemplateBuilder
- 并行分布式运维工具pdsh
- (转)AI泡沫已现:资金多而项目缺,周期长而营收难
- mysql全文索引详解_MySql全文索引详解
- Spring Boot在使用Gradle build命令卡住不动了
- 盘点软件开发中那些有趣的边际效应
- 谷歌无法打开微信二维码链接解决方案 之 使用谷歌模拟微信浏览器
- 配置HTTPS,和HTTPS转HTTP
- JWT实战 Spring Security Oauth2整合JWT 整合SSO单点登录
- 软件设计与体系结构第三次实验——web服务开发
- 基于html+css的两张图片并排
热门文章
- Spring入门第二十五课
- PHP数据结构之三 线性表中的单链表的PHP实现
- .NET系统架构改造的经验和教训
- qt商业版和开源版的区别_微擎商业版系统V2.0.9全开源版纯净框架
- 随机森林和gbdt结合_决策树与迭代决策树(GBDT)
- 点击网页跟踪php代码的工具,使用ltrace工具跟踪PHP库函数调用的方法
- android中的add方法,Android入门之addWindow
- matlab的数学函数,matlab中常见数学函数的使用
- java web开发技术大_2021年六大javaweb开发主流技术
- 西瓜创客python编程进阶收费_西瓜创客和编程猫有什么不同?哪个更值得报名?...