下面是StringCopy()函数的最原始版本,基于标准库的strcpy(),该函数用了数组符号,较为容易理解
char *StringCopy( char dest[ ], char sour[ ] )
{
int i;
for(i=0; sour[i]!='/0'; i++)
{
dest[i] = sour[i];
}
dest[i] = '/0';
return dest;
}
下面是StringCopy()函数的另外一个版本,用指针代替数组,完成了同样的功能。
char *StringCopy( char *dest, char *sour )
{
int i;
for(i=0; sour[i]!='/0'; i++)
{
dest[i] = sour[i];
}
dest[i] = '/0';
return dest;
}
将程序部分也改用指针来写
char *StringCopy( char *dest, char *sour )
{
int i;
for(i=0; *(sour+i)!='/0'; i++)
{
*(dest+i) = *(sour+i);
}
*(dest+i) = '/0';
return dest;
}
如果对该函数用指针参数,就不再需要指针变量i进行指针递增了,源程序如下
char *StringCopy( char *dest, char *sour )
{
char *temp = dest; //保存最后要返回的dest的首地址
for(; *sour!='/0'; sour++, dest++)
{
*dest = *sour;
}
*dest = '/0';
dest = temp;
return dest;
}
下面,我们可以让for循环的判断更加有效,这个版本依然要检查空字符,但是它是通过检查字符本身来判断。因为空字符等于0,当遇到空字符时判断条件为假。
char *StringCopy( char *dest, char *sour )
{
char *temp = dest; //保存最后要返回的dest的首地址
for(; *sour; sour++, dest++)
{
*dest = *sour;
}
*dest = '/0';
dest = temp;
return dest;
}
用一个赋值语句就可以让该函数变的更加高效,赋值语句就等于一个值,这个值就是被赋予的值。据此可以让循环变的更加简洁。
char *StringCopy( char *dest, char *sour )
{
char *temp = dest; //保存最后要返回的dest的首地址
for(; *dest = *sour; sour++, dest++)
{
}
dest = temp;
return dest;
}
当我们采用while循环时,我们发现可以让该函数更加简洁:
char *StringCopy( char *dest, char *sour )
{
char *temp = dest; //保存最后要返回的dest的首地址
while(*dest++ = *sour++)
{
}
return temp;
}
当然,我们注意到该while循环体为空,因此完全可以用一个分号取代该循环体以得到我们的StringCopy()的最终简化版:
char *StringCopy( char *dest, char *sour )
{
char *temp = dest; //保存最后要返回的dest的首地址
while(*dest++ = *sour++);
return temp;
}
这个函数短小精悍,但是他与最原始的函数完成的是同样的事情。
以上例程来自于《软件开发:编程与设计(C语言版)》P345-349,代码均在DEVC4.9.9.2编程环境下调试通过