常见字符串函数的学习总结
来源:互联网 发布:淘宝号申请日期怎么看 编辑:程序博客网 时间:2024/05/22 07:40
在之前获取IP地址中,自己稍微总结了一部分,但是书到用时方恨少,今天就把自己经常用到的字符串函数整理一遍。
str系列
头文件#include <string.h>
strstr
函数功能
strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL。
实例
1 /********************************************************************************* 2 * Copyright: (C) 2017 fanmaolin<fanmaolinn@gmail.com> 3 * All rights reserved. 4 * 5 * Filename: strstr.c 6 * Description: This file 7 * 8 * Version: 1.0.0(08/04/2017) 9 * Author: fanmaolin <fanmaolinn@gmail.com> 10 * ChangeLog: 1, Release initial version on "08/04/2017 09:17:39 PM" 11 * 12 ********************************************************************************/ 13 14 #include <stdio.h> 15 #include <string.h> 16 17 int main(void) 18 { 19 char str[] = "My name is fanmaolin"; 20 char *pstr; 21 22 pstr = strstr(str, "fanmaolin"); 23 printf("the string %s here\n", pstr); 24 }
编译后
strchr
函数功能
原型为extern char *strchr(const char *s,char c)
,可以查找字符串s中首次出现字符c的位置。成功则返回要查找字符第一次出现的位置,失败返回NULL
实例
14 #include <stdio.h> 15 #include <string.h> 16 17 int main(void) 18 { 19 char str[] = "My name is fanmaolin"; 20 char *pch = NULL; 21 22 pch = strchr(str, 'a'); 23 printf("find it at %d\n", pch - str + 1); 24 25 26 }
结果:
strcpy
函数功能
原型声明:char *strcpy(char* dest, const char *src);
功能:把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间
说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
返回指向dest的指针。
常用于字符串赋值
实例
14 #include <stdio.h> 15 #include <string.h> 16 17 int main(void) 18 { 19 char str[100]; 20 char *pstr = "My name is fanmaolin"; 21 22 strcpy(str, pstr); 23 printf("%s\n", str); 24 }
结果:
[fanmaolin@Centeros str]$ gcc str.c [fanmaolin@Centeros str]$ ./a.out My name is fanmaolin
strncpy
函数功能
和strcpy用法类似,可以防止溢出
函数原型char *strncpy(char *dest,char *src,size_t n);
(c/c++)复制字符串src中的内容(字符,数字、汉字….)到字符串dest中,复制多少由size_tn的值决定。
4 #include <stdio.h> 15 #include <string.h> 16 17 int main(void) 18 { 19 char str[11]; 20 char *pstr = "My name is fanmaolin"; 21 22 strncpy(str, pstr, 10); 23 printf("%s\n", str); 24 }
结果:
[fanmaolin@Centeros str]$ gcc str.c [fanmaolin@Centeros str]$ ./a.out My name is@
1)src串长度<=dest串长度,(这里的串长度包含串尾NULL字符)
如果n>src由于长度达到src NULL,正常复制,特别注意,如果src中有NULL,strncpy复制到NULL即使没到n也提前停止。如果n = src串长度,与strcpy一致。注意n的选择当n > dest串长度,dest栈空间溢出产生崩溃异常。
2)src串长度>dest串长度
如果n =dest串长度,则dest串没有NULL字符,会导致输出会有乱码。如果不考虑src串复制完整性,可以将dest 最后一字符置为NULL。
综上,一般情况下,使用strncpy时,建议将n置为dest串长度(除非你将多个src串都复制到dest数组,并且从dest尾部反向操作),复制完毕后,为保险起见,将dest串最后一字符置NULL,避免发生输出乱码问题。当然喽,无论是strcpy还是strncpy,保证dest串容量(能容纳下src串)才是最重要的。
strcmp
之前在做驱动的时候有用到strcmp,用来比较字符串大小
函数功能
strcmp(const char *str1,const char * str2)
比较两个字符串
设这两个字符串为str1,str2,
若str1==str2,则返回零;
若str1< str2,则返回负数;
若str1> str2,则返回正数。
即:两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇’\0’为止。如:
“A”<”B” “a”>”A” “computer”>”compare”
特别注意:strcmp(const char *str1,const char * str2)
这里面只能比较字符串,即可用于比较两个字符串常量,或比较数组和字符串常量,不能比较数字等其他形式的参数。
实例:
14 #include <stdio.h> 15 #include <string.h> 16 17 int main(void) 18 { 19 char str1 = 'a'; 20 char str2 = 'A'; 21 int s = 0; 22 23 s = strcmp(&str1, &str2); 24 25 if(s > 0) 26 { 27 printf("str1 > str2\n"); 28 } 29 else if(s == 0) 30 { 31 printf("str1 == str2\n"); 32 } 33 else 34 { 35 printf("str1 < str2\n"); 36 } 37 38 }
结果:
[fanmaolin@Centeros str]$ gcc str.c [fanmaolin@Centeros str]$ ./a.out str1 > str2
需要注意的是str1和str2在strcmp函数中要求是指针类型,所以我用了“&”取地址符。
strncmp
与strcmp类似 int strncmp ( const char * str1, const char * str2, size_t n );
str1, str2 为需要比较的两个字符串,n为要比较的字符的数目。
字符串大小的比较是以ASCII 码表上的顺序来决定,此顺序亦为字符的值。strncmp()首先将s1 第一个字符值减去s2 第一个字符值,若差值为0 则再继续比较下个字符,直到字符结束标志’\0’,若差值不为0,则将差值返回。例如字符串”Ac”和”ba”比较则会返回字符”A”(65)和’b’(98)的差值(-33)。注意:要比较的字符包括字符串结束标志’\0’,而且一旦遇到’\0’就结束比较,无论n是多少,不再继续比较后边的字符。
【返回值】若str1与str2的前n个字符相同,则返回0;若s1大于s2,则返回大于0的值;若s1 若小于s2,则返回小于0的值。
strlen
函数功能
原型:size_t strlen ( const char * str );
计算字符串 str 的长度
说明:返回 str 的长度,不包括结束符NULL。(注意与 sizeof 的区别)
实例
14 #include <stdio.h> 15 #include <string.h> 16 17 int main(void) 18 { 19 char *str = "absdjkabnsdkja"; 20 int len = 0; 21 len = strlen(str); 22 printf("字符串长度为%d\n", len); 23 }
结果:
[fanmaolin@Centeros str]$ gcc strlen.c [fanmaolin@Centeros str]$ ./a.out 字符串长度为14
strnlen
size_t strnlen(const char *str, size_t maxlen);
计算字符串str的(unsigned int型)长度,不包括结束符NULL,该长度最大为maxlen。
sizeof()与strlen()区别简析
我个人理解为:
sizeof()求的是存储空间的大小
strlen()只是求字符串的长度
还有很多其他差别:
如strlen()是函数,sizeof()不是
sizeof()可以求函数空间大小等等
https://baike.baidu.com/item/strlen/2737?fr=aladdin
strcat
函数功能
extern char *strcat(char *dest, const char *src);
把src所指字符串添加到dest结尾处(覆盖dest结尾处的’\0’)。
src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
返回指向dest的指针。
实例
14 #include <stdio.h> 15 #include <string.h> 16 17 int main(void) 18 { 19 char *str1 = "absdjkabnsdkja"; 20 char str2[100] = "My name is fanmaolin"; 21 22 strcat(&str2, str1); 23 24 printf("%s\n", str2); 25 }
结果:
[fanmaolin@Centeros str]$ ./a.out My name is fanmaolinabsdjkabnsdkja
strncat
函数功能
char * strncat(char *dest, const char *src, size_t n);
dest指向目标字符串,src为指向源字符串。
把src所指字符串的前n个字符添加到dest所指字符串的结尾处,并覆盖dest所指字符串结尾的’\0’,从而实现字符串的连接。
mem系列
头文件为 <memory.h>或<string.h>
memset
功能介绍
void *memset(void *s, int ch, size_t n);
函数解释:将s中当前位置后面的n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。
memset:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法,通常为新申请的内存做初始化工作
实例
14 #include <stdio.h> 15 #include <memory.h> 16 17 int main(void) 18 { 19 char str[] = "My name is fanmaolin"; 20 printf("now the str is %s\n", str); 21 memset(str, 0 ,sizeof(str)); 22 printf("now the str is %s\n", str); 23 }
结果:
[fanmaolin@Centeros str]$ gcc memset.c [fanmaolin@Centeros str]$ ./a.out now the str is My name is fanmaolinnow the str is
memcpy
函数功能
void *memcpy(void *dest, const void *src, size_t n);
从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中,函数返回指向dest的指针
总结:
还有很多字符串函数,有些功能会类似,在使用时重要的是灵活运用和熟练使用。
参考链接:
http://www.cnblogs.com/xiangzi888/archive/2012/04/16/2451947.html
- 常见字符串函数的学习总结
- 常见的字符串函数
- 常见字符串处理函数返回值的总结
- MYSQL学习笔记(四)之常见的字符串函数
- C语言字符串函数总结(部分常见字符串函数)
- 常见的java字符串函数
- 常见字符串函数的原型!!!
- 常见的字符串复制函数
- 常见字符串函数的实现
- 字符串处理函数学习总结
- 字符串函数的总结
- oracle常见的函数总结
- SQL学习(4)——MySQL数据库常用的函数--常见的字符串函数
- c字符串和字符串函数学习总结
- 几个常见字符串函数的实现
- 几个常见的字符串处理函数
- 常见的字符串哈希函数
- PHP常见的字符串处理函数
- Exponentiation
- TCP协议如何保证传输的可靠性
- Java产生死锁的一个简单例子
- spring 事务的总结
- STL学习&&数据结构
- 常见字符串函数的学习总结
- ConcurrentLinkedQueue学习
- 学大数据为什么要学Java
- navicat premium 64位 ,管理MYSQL,SQLite3的好工具
- Temporary failure in name resolution
- eclipse日常使用
- 用Dockerfile构建java web环境(2)
- sqlservler 插入与批量插入
- 小V画了一幅图