C++的string类提供了大量的字符串操作函数,提取字符串的一部分,可采用substr函数实现:
-
头文件:
#include <string> //注意没有.h string.h是C的标准字符串函数数,c++中一般起名为ctring. 而string头文件是C++的字符串头文件。
-
函数原型:
string substr(int pos = 0,int n ) const;
-
函数说明:
参数1pos是可缺省参数,默认为0,即:从字符串头开始读取。
参数2n表示取多少个字符
该函数功能为:返回从pos开始的n个字符组成的字符串,原字符串不被改变
参考代码:
学习笔记: (一) 函数名称前面加引用符号“&”,代表该函数返回值类型是引用。 如:int &operate+(...); (二) 函数名称前面加指针符号“*”,代表它是函数指针。 函数指针是一个指向函数的指针,函数指针表示一个函数的入口地址。使用函数指针的好处就是在处理“在运行时根据数据的具体状态来选择相应的处理方式”这种需求时更加灵活。 定义一个函数指针 int a=10; int *pa=&a; 这里,pa是一个指向整型的指针,定义这个指针的形式为: int * pa; 它说明了两点:(1)这是一个指针(2)这是一个指向整型变量的指针 以下给出三个函数指针定义的形式,第一个是C语言的函数指针,第二个和第三个是C++的函数指针的定义形式(都是指向非静态函数成员的函数指针): int (*pFunction)(float,char,char)=NULL; int (MyClass::*pMemberFunction)(float,char,char)=NULL; int (MyClass::*pConstMemberFunction)(float,char,char) const=NULL; 首先,要记住一点的就是形式一定要具备完备性,能表达出我们所要表达的内容,即指向函数这个事实。我们知道普通变量指针可以指向对应类型的任何变量,同样函数指针也应该能够指向对应类型的任何变量。对应的函数类型靠什么来确定?这个我们可以想一下C++的函数重载靠什么来区分不同的函数?这里,函数类型是靠这几个方面来确定的:(1)函数的参数个数(2)函数的参数类型(3)函数的返回值类型。所以我们要设计一种形式,这种形式定义的函数指针能够准确的指向这种函数类型的任何函数。 在C语言中这种形式为: 返回类型 (*函数指针名称)(参数类型,参数类型,参数类型,…); //注意这是在定义函数指针 嗯,定义变量的形式显然不是我们通常见到的这种形式: 类型名称 变量名称; 因为函数指针不加括号就会产生二义性,就像下面这个: 返回类型 *函数指针名称(参数类型,参数类型,参数类型,…); //注意这是在定义函数 这样的定义形式定义了一个“返回类型为‘返回类型*’参数为(参数类型,参数类型,参数类型,…)的函数而不是函数指针了。 接下来,对于C++来说,下面这样的定义形式也就不难理解了(加上类名称是为了区分不同类中定义的相同名称的成员函数): 返回类型 (类名称::*函数成员名称)(参数类型,参数类型,参数类型,….) 函数的调用规则 给函数指针赋值和调用 int func1(float f,int a,int b){return f*a/b;} int func2(float f,int a,int b){return f*a*b} 然后我们给函数指针pFunction赋值: pFunction=func1; pFunction=&func2; 上面这段代码说明了两个问题:(1)一个函数指针可以多次赋值(引用不能这样)(2)取地址符号是可选的,却是推荐使用的。 我们可以思考一下为什么取地址符号是可选的,在普通的指针变量赋值时,如上面所示,需要加取地址符号,而这里却是可选的?这是由于要同时考虑到两个因素(1)避免二义性(2)形式一致性。在普通指针赋值,需要加取地址符号是为了区别于将地址还是将内容赋给指针。而在函数赋值时没有这种考虑,因为这里的语义是清晰的,加上&符号是为了和普通指针变量一致---“因为一致的时候就不容易出错”。 最后我们来使用这个函数,以下两者调用函数的方法都是可以的 pFunction(10.0,’a’,’b’); (*pFunction)(10.0,’a’,’b’); 同时函数指针可以当参数使用实现回调函数,让程序变得更加简单。 |