版权归原作者所有,如有侵权,请联系我们

[科普中国]-字符函数引用

科学百科
原创
科学百科为用户提供权威科普内容,打造知识科普阵地
收藏

简介

程序按功能划分可分为数值运算、符号处理和I/O操作三类,符号处理程序占相当大的比例,符号处理程序无处不在,编译器、浏览器、Office套件等程序的主要功能都是符号处理。

在程序中通过对函数的调用来执行函数体,其过程与其它语言的子程序调用相似。

C语言中,函数调用的一般形式为:

函数名(实际参数表)

对无参函数调用时则无实际参数表。实际参数表中的参数可以是常数、变量或其它构造类型数据及表达式。各实参之间用逗号分隔。1字符函数引用即对引用有关库函数或自定义函数函数。

C语言中常见字符串函数strcpy原型:extern char *strcpy(char *dest,char *src);

用法:#include

功能:把src所指由NUL结束的字符串复制到dest所指的数组中。

返回指向dest结尾处字符(NUL)的指针。

strcat原型:extern char *strcat(char *dest,char *src);

用法:#include

功能:把src所指字符串添加到dest结尾处(覆盖dest结尾处的'\0')并添加'\0'。

返回指向dest的指针。

strlen原型:extern int strlen(char *s);

用法:#include

功能:计算字符串s的长度

说明:返回s的长度,不包括结束符NULL。

strncat原型:extern char *strncat(char *dest,char *src,int n);

用法:#include

功能:把src所指字符串的前n个字符添加到dest结尾处(覆盖dest结尾处的'\0')并添加'\0'。

返回指向dest的指针。

strncpy原型:extern char *strncpy(char *dest, char *src, int n);

用法:#include

功能:把src所指由NULL结束的字符串的前n个字节复制到dest所指的数组中。

stricmp功 能: 以大小写不敏感方式比较两个串

用 法: int stricmp(char *str1, char *str2);

strerror功 能: 返回指向错误信息字符串的指针

用 法: char *strerror(int errnum);

strcmp功 能: 将一个串与另一个比较

用 法: intstrcmpi(char *str1, char *str2);

strncmp功 能: 把串中的一部分与另一串中的一部分比较 (前n个字符)

用 法: int strncmp(char *str1, char *str2,int maxlen);

strnicmp功 能: 不注重大小写地比较两个串的前n个字符

用 法: intstrnicmp(char *str1, char *str2, unsigned maxlen);

strpbrk功 能: 在串中查找给定字符集中的字符

用 法: char *strpbrk(char *str1, char *str2);

strrchr功 能: 在串中查找指定字符的最后一个出现

用 法: char *strrchr(char *str, char c);

strrev功 能: 串倒转

用 法: char *strrev(char *str);

strset功 能: 将一个串中的所有字符都设为指定字符

用 法: char *strset(char *str, char c);

strspn功 能: 返回字符串中第一个不在指定字符串中出现的字符下标

用 法: int strspn(char *str1, char *str2);

strstr功 能: 在串中查找指定字符串的第一次出现

用 法: char *strstr(char *str1, char *str2);

strtod功 能: 将字符串转换为double型值

用 法: double strtod(char *str, char **endptr);

strtok功 能: 查找由在第二个串中指定的分界符分隔开的单词

用 法: char *strtok(char *str1, char *str2);

strupr功 能: 将串中的小写字母转换为大写字母

用 法: char *strupr(char *str);

swab功 能: 交换字节

用 法: void swab (char *from, char *to, int nbytes);

isalpha原型:extern int isalpha(int c);

用法:#include

功能:判断字符c是否为英文字母

说明:当c为英文字母a-z或A-Z时,返回非零值,否则返回零。

引用引用的概念引用引入了对象的一个同义词。定义引用的表示方法与定义指针相似,只是用&代替了*。

例如: Point pt1(10,10);

Point &pt2=pt1; 定义了pt2为pt1的引用。通过这样的定义,pt1和pt2表示同一对象。

需要特别强调的是引用并不产生对象的副本,仅仅是对象的同义词。因此,当下面的语句执行后:

pt1.offset(2,2);

pt1和pt2都具有(12,12)的值。

引用必须在定义时马上被初始化,因为它必须是某个东西的同义词。你不能先定义一个引用后才

初始化它。例如下面语句是非法的:

Point &pt3;

pt3=pt1;

那么既然引用只是某个东西的同义词,它有什么用途呢?

下面讨论引用的两个主要用途:作为函数参数以及从函数中返回左值。

引用参数传递可变参数

传统的c中,函数在调用时参数是通过值来传递的,这就是说函数的参数不具备返回值的能力。

所以在传统的c中,如果需要函数的参数具有返回值的能力,往往是通过指针来实现的。比如,实现

两整数变量值交换的c程序如下:

void swapint(int *a,int *b)

{

int temp;

temp=*a;

a=*b;

*b=temp;

}

使用引用机制后,以上程序的c++版本为:

void swapint(int &a,int &b)

{

int temp;

temp=a;

a=b;

b=temp;

}

调用该函数的c++方法为:swapint(x,y); c++自动把x,y的地址作为参数传递给swapint函数。

给函数传递大型对象

当大型对象被传递给函数时,使用引用参数可使参数传递效率得到提高,因为引用并不产生对象的

副本,也就是参数传递时,对象无须复制。下面的例子定义了一个有限整数集合的类:

const maxCard=100;

Class Set

{

int elems[maxCard]; // 集和中的元素,maxCard 表示集合中元素个数的最大值。

int card; // 集合中元素的个数。

public:

Set () {card=0;} //构造函数

friend Set operator * (Set ,Set ) ; //重载运算符号*,用于计算集合的交集 用对象作为传值参数

// friend Set operator * (Set & ,Set & ) 重载运算符号*,用于计算集合的交集 用对象的引用作为传值参数

...

}

先考虑集合交集的实现

Set operator *( Set Set1,Set Set2)

{

Set res;

for(int i=0;iSet2.card;++j)

if(Set1.elems[i]==Set2.elems[j])

{

res.elems[res.card++]=Set1.elems[i];

break;

}

return res;

}

由于重载运算符不能对指针单独操作,我们必须把运算数声明为 Set 类型而不是 Set * 。

每次使用*做交集运算时,整个集合都被复制,这样效率很低。我们可以用引用来避免这种情况。

Set operator *( Set &Set1,Set &Set2)

{ Set res;

for(int i=0;iSet2.card;++j)

if(Set1.elems[i]==Set2.elems[j])

{

res.elems[res.card++]=Set1.elems[i];

break;

}

return res;

}

引用返回值如果一个函数返回了引用,那么该函数的调用也可以被赋值。这里有一函数,它拥有两个引用参数并返回一个双精度数的引用:

double &max(double &d1,double &d2)

{

return d1>d2?d1:d2;

}

由于max()函数返回一个对双精度数的引用,那么我们就可以用max() 来对其中较大的双精度数加1:

max(x,y)+=1.0;