许多字符串处理函数是不需要返回值的,但实际上它们都被设计成了有返回值的函数。例如字符串赋值函数的函数原型为:
char *strcpy(char *str1, const char *str2);
字符串连接函数strcat()的函数原型为;
char *strcat(char *str1,const char *str2);
这两个函数返回的都是字符指针str1,即存储字符串str1的内存空间的首地址,为什么要这样设计字符串处理函数呢?
其实,这样的设计并非是多此一举,它的主要目的是为了增加使用时的灵活性,如支持表达式的链式表达,方便一些级联操作。
例如,可将下面两条语句:
strcat(str1,"Hello China");
len = strlen(str1);
直接写成:
len = strlen(strcat(str1,"Hello China"));
再如,我们可将
strcat(str1,str2);
printf("%s",str1);
直接写成:
printf(“%s”,strcat(str1,str2));
函数之间的握手(信息交换)是通过函数参数和返回值来实现的。因此设计一个函数时,必须首先考虑有几个参数,分别是什么数据类型;同时还要考虑函数返回值的类型,即函数调用完成后,应当返回给调用者什么样的结果。
函数返回值可以是一个数值运算的结果值,也可以是一个代表函数调用成功或失败的逻辑值(True或False,在C语言中分别用非0和0表示)。但是函数只能返回一个值,如何从函数返回一组值(数组或字符串)呢?
一种常见的方法是利用数组或者指针作为函数参数,通过传地址调用来获得这些数据值,另一种方法就通过返回指针值得函数来返回一个地址值,即只想存储器这些数据的一段连续内存空间得首地址,从而获得这些数据值。
返回指针值得函数得定义方式与以前定义函数得方式基本相同,唯一不同的是在函数名的前面多了一个“*”号。例如,可按如下方式来声明一个返回指针值得函数:
char *mystrcat(char *dststr,const char * srcstr);
这里mystrcat是函数名,因为()在C语言中具有最高的优先级,所以mystrcat将首先与()结合,表示mystrcat()是一个函数,他有两个形参dststr和srcstr,*号作为一元运算符比()得优先级稍低,所以他说明函数得返回值是一个字符指针。
例题:不适用字符串处理函数strcat(),编程实现strcat()得功能。(返回字符串指针)
#include <stdio.h>
#define N 80
char *mystrcat(char *dststr,char *srcstr);
int main(void)
{
char first[2*N];
char second[N];
printf("Input the first string:");
gets(first);
printf("Input the second string:");
gets(second);
printf("The result is :%s\n",mystrcat(first,second));
return 0;
}
char *mystrcat(char *dststr,char *srcstr)
{
char *pstr = dststr;
while(*dststr!='\0')//计算第一个字符串长度。
{
dststr++;
}
for(;*srcstr!='\0';dststr++,srcstr++)// 从first得空位置开始复制第二个字符串。
{
*dststr = *srcstr;
}
*dststr='\0';
return pstr;
}