计算机网络基础_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
目前,我在学习中碰到的字符串操作函数有: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
相关文章推荐
- 网络子系统80_inet协议族-SOCK_RAW(一)
- Linux网络编程一步一步学-编写一个HTTP协议的目录
- 让HTTP萌娘帮你记住状态码吧
- 网络传输时,Java中byte[]转String问题
- 关于安卓HTTP请求用HttpUrlConnection仍是HttpClient好
- axis2处理http 307问题
- Android 网络编程 Socket Http
- linux C发送 http 请求
- HttpApplication整体请求图
- 网络编程--IO模型示例
- Restful是一种非常优美的http接口设计风格及设计规范
- 基于IPv6的下一代网络技术的特征分析
- Win7+VMware Workstation环境下的CentOS-Linux网络连接设置
- Android联网使用HttpClient 和HttpResponse 小结
- 乐视网络电视 v7.0.3.198 官方版
- 安卓上网络图片的处理解决oom------------Universal Image Loader for Android
- android下httpd 代理设置和webview代理设置
- Nginx网络负载均衡,负载均衡,网络负载,网络均衡
- Linux Mint + Apache2.2搭建SSL/HTTPS/SPDY服务器
- HTTP状态码详解