您的位置:首页 > 理论基础 > 计算机网络

计算机网络基础_2_网络层的作用(上) --IP地址、子网掩码和路由器的作用

2014-02-27 17:00 417 查看
关于字符串的操作函数有很多,那么在众多的函数中是否有一个共通的地方。下面简略分析一下。
目前,我在学习中碰到的字符串操作函数有:strlen,strcat,strcpy,strcmp;
那么我们按照上面的顺序一一介绍一下。
1.strlen
strlen 是求取字符串长度的函数;其原型为:size_t strlen( const char *string );

实现:int strlen(const char *string)
{
assert(string);//对指针的有效性进行检测
int count=0;
while(*string++) //相当于(*string != '\0')
{
count++;
}
return count;
}
在实现部分有几点,我认为可以加分的选项。
1).const字符的使用,避免了在函数内部不小心改掉字符串的值。
2).assert—指针有效性的检查。
作为初学者,在学习这一部分的时候,应该看看编译器中的源码是怎么实现这些函数的和函数的 原型是什么以及函数的返回值是什么。以便于我们在自己实现这些函数的时候,不会手足无措。
2.strcat
作为字符串追加函数,完成的是将源(src)追加到目标(dest)上。那么,让我们看看strcat的原型,[b]char *strcat( char *strDestination, const char *strSource );[/b]
[b] 实现代码:[/b]
char *my_strcat(char *dest, const char *src)
{
assert(dest);
assert(src);
char *ret = *dest;
while (*dest)
{
dest++;
}
while (*dest++ = *src++)
{
;
}
return ret;
}
同样,在这个函数中有几点,需要注意。
1).const assert这些就不再啰嗦了。
2).char * 作为函数的开头是为了有一个链式访问。
3).在目标字符串遍历指向'\0'的代码中,不可以这样写.str
while(*dest++)
{
;
}
让我们试着分析一下,后置++在*dest为'\0'的时候,dest还往后面内存偏移了一块空间。那么,会造成什么结果呢?
eg:将字符串" to xian!"追加到字符串"welcome"的后面。由于*dest指向了'\0'后面的位置,那么在输出的时候,只会输出welcome。
4).上述代码中追加部分,已经将'\0'拷贝进去了。

5).这点要说的是我在才开始犯的错误,是在主函数中。看看主函数的代码。 int main() { char str1[] = "welcome"; char str2[] = " to xian"; my_strcat(str1, str2); printf("%s", str1); system("pause"); return 0; } 当在vs2013中运行,会出现奔溃。
试着分析一下原因。在主函数加载内存的时候,为str1分配了8个字节的大小(我把"\0"也算进去),当你字符串追加的时候,要在8个字节的空间放16个字节的内容,很明显程序会奔溃。那么,接下来改动程序就变得很简单,只需要给str1分配最够的空间即可 。 3.strcpy
字符串拷贝函数。函数原型:[b]char *strcpy( char *strDestination, const char *strSource );[/b]
[b] 实现:[/b]
char *strcpy(char *dest, const char *src)
{
assert(dest);
assert(src);
char *ret = dest;
while (*src)
{
*dest = *src;
src++;
dest++;
}
*dest = '\0';
return ret;
}
同样,这里要告诉大家我在写这个函数的时候遇到的问题。

1).首先是const和assert的使用。
2).在拷贝的代码中可以简化书写。
while(*dest++ = *src++),同时不要忘记while循环中有语句。不建议写成[b]while(*dest++ = *src++);(注意后面的“;”是while循环的语句)。应该写成[/b]
[b][b] while(*dest++ = *src++)[/b][/b]
[b][b] {[/b][/b]
[b][b] ;[/b][/b]
[b][b] }[/b][/b]
这样别人再看你的代码的时候也会一目了然,同时便与查错。
4.strcmp
字符串比较函数。函数原型:[b]int strcmp( const char *string1,
const char *string2 );[/b]
[b] 实现:[/b]
int my_strcmp(const char *dest, const char *src)
{
assert(dest);
assert(src);
while (*dest == *src)
{
if (*src == '\0')
return 0;
dest++;
src++;
}
return *dest - *src;
}
同样,分析一下这个函数。
1).再次强调 const和assert的使用。
2).关注一下这个函数的返回值。


以上就是本人在学习过程中的一些经验总结。当然,本人能力有限,难免会有纰漏,希望大家可以指正。

本文出自 “做一个小小小司机” 博客,请务必保留此出处http://10799170.blog.51cto.com/10789170/1715083
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: