字符串处理
Posted lemongirl
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字符串处理相关的知识,希望对你有一定的参考价值。
一.字符串处理函数
1.strlen
原型:int strlen(const char *str)
功能:返回字符串的实际长度,不含‘\0‘
#include <stdio.h> #include <string.h> int main(int argc,char *argv[]) { char str1[20] = "hello"; char *str2 = "hello"; printf("sizeof_str1 = %d\n",sizeof(str1)); //20 printf("sizeof_str2 = %d\n",sizeof(str2)); //4 printf("strlen_str1 = %d\n",strlen(str1)); //5 printf("strlen_str1 = %d\n",strlen(str1)); //5 return 0; }
2.strcpy
原型:char *strcpy(char *dest,const char *src) //第二个参数用const修饰表示只读
功能:把src所指向的字符串复制到dest所指向的空间中,‘\0‘也会拷贝
返回值:返回dest字符串的首地址
3.strncpy
原型:char *strncpy(char *dest,const char *src,int num)
功能:把src所指向的字符串的前num个复制到dest所指向的空间中,‘\0‘不会拷贝
返回值:返回dest字符串的首地址
#include <stdio.h> #include <string.h> int main(int argc,char *argv[]) { char dest1[20] = "123456789"; char dest2[20] = "123456789"; char dest3[20]; char *src = "hello world"; strcpy(dest1,src); printf("dest1 = %s\n",dest1); //hello world strncpy(dest2,src,5); printf("dest2 = %s\n",dest2); //hello6789 dest2[5] = ‘\0‘; printf("dest2 = %s\n",dest2); //hello strncpy(dest3,src,5); printf("dest3 = %s\n",dest3); //hello……乱码,后面没有\0 dest3[5] = ‘\0‘; printf("dest3 = %s\n",dest3); //hello return 0; }
4.strcat
原型:char *strcat(char *str1,char *str2)
功能:将str2连接到str1后面,‘\0‘会一起拷贝过去
返回值:返回str1字符串的首地址
5.strncat
原型:char *strncat(char *str1,char *str2,int num)
功能:将str2前num个字母连接到str1后面,‘\0‘会一起拷贝过去
返回值:返回str1字符串的首地址
#include <stdio.h> #include <string.h> int main(int argc,char *argv[]) { char str1[20] = "hello"; char str2[20] = "hello"; char *src = "Kitty hello"; strcat(str1,src); printf("str1 = %s\n",str1); //helloKitty hello strncat(str2,src,5); printf("str2 = %s\n",str2); //helloKitty return 0; }
6.strcmp
原型:int strcmp(char *str1,char *str2)
功能:比较str和str2的大小
返回值:相等返回0
str1大于str2,返回>0
str1小于str2,返回<0
7.strncmp
原型:int strncmp(char *str1,char *str2,int num)
功能:比较str和str2前n个字符串的大小
返回值:相等返回0
str1大于str2,返回>0
str1小于str2,返回<0
#include <stdio.h> #include <string.h> int main(int argc,char *argv[]) { char *str1 = "hello Kitty"; char *str2 = "hello world"; if(strcmp(str1,str2) == 0) printf("str1 = str2\n"); else if(strcmp(str1,str2) > 0) printf("str1 > str2\n"); else printf("str1 < str2\n"); if(strncmp(str1,str2,5) == 0) printf("str1 = str2\n"); else if(strncmp(str1,str2,5) > 0) printf("str1 > str2\n"); else printf("str1 < str2\n"); return 0; }
二.字符串变换函数
1.strchr 字符匹配函数
原型:char* strchr(const char *str,char ch)
功能:在字符串str中查找字母ch出现的位置
返回值:如果找到,返回第一次出现的ch地址
如果未找到,返回NULL
2.strstr 字符串匹配函数
原型:char* strstr(const char *str1,char* str2)
功能:在字符串str1中查找字符串str2出现的位置
返回值:如果找到,返回第一次出现的str2地址
如果未找到,返回NULL
3.memset 空间设定含税
原型:void* memset(void *str,char c,int n)
功能:将str所指向的内存区的前n个全部用c填充,常用于清楚指定空间,比如数组或malloc的空间
返回值:返回str的地址
#include <stdio.h> #include <string.h> #include <stdlib.h> int main(int argc,char *argv[]) { char str1[20] = "hello $#$ Kitty"; char *str2 = NULL; memset(str1,‘*‘,strlen(str1)); printf("str1 = %s\n",str1); //str1 = *************** str2 = (char *)malloc(10*sizeof(char)); memset(str2,0,10*sizeof(char)); printf("str2 = %s\n",str2); //str2 = free(str2); return 0; }
4.atoi/atol/atof 字符串转换功能
原型:int atoi(const char *str)
long int atol(const char *str)
double atof(const char *str)
功能:将str所指向的数字字符串转化为int/long/doule
#include <stdio.h> #include <string.h> #include <stdlib.h> int main(int argc,char *argv[]) { char str1[] = "12345",str2[]="56789",str3[]="123.456"; int num1; long int num2; double num3; num1 = atoi(str1); num2 = atol(str2); num3 = atof(str3); printf("num1 = %d,num2 = %ld,num3 = %lf\n",num1,num2,num3); //num1 = 12345,num2 = 56789,num = 123.456000 return 0; }
5.strtok 字符串分割函数
原型:char *strtok(char str[],const char *delim)
功能:strtok()用来将字符串分割成一个个片段
参数1:str指向欲分割的字符串
参数2:delim则为分割字符串中包含的所有字符
? 当strtok()在参数str的字符串中发现参数delim中包含的分割字符时,则会将该字符改为\0字符,当连续出现多个时只替换第一个为\0。
? 在第一次调用时:strtok()必须给予参数str字符串,往后的调用则将参数str设置成NULL,每次调用成功则返回指向被分割出片段的指针。
? 切割完之后原字符串发生了改变。
#include <stdio.h> #include <string.h> int main(int argc,char *argv[]) { char str1[] = "abc*!$def*fhnbh!cdsn$*cndsk$!*hbh$ncdcbd"; char *str2 = "*!$"; char *result[10]; int i,num = 0; result[num] = strtok(str1,str2); while(result[num] != NULL) { num++; result[num] = strtok(NULL,str2); } for(i = 0;i < num;i++) printf("result[%d] = %s\n",i,result[i]); printf("str1 = %s\n",str1); //*被替换成了\0,所以只输出了abc return 0; } // 输出结果: // result[0] = abc // result[1] = def // result[2] = fhnbh // result[3] = cdsn // result[4] = cndsk // result[5] = hbh // result[6] = ncdcbd // str1 = abc
三.格式化字符串操作函数
- int sprintf(char *buf,const char *format, ……); //输出到buf指定的内存区域
例如:char buf[20];
sprintf(buf,"%d:%d:%d",2017,11,25);
- int sscanf(const char *buf,const char *format, ……); //从buf指定的内存区域中读入信息
例如:int a,b,c;
sscanf("2017:11:25","%d:%d:%d",&a,&b,&c);
#include <stdio.h> #include <string.h> int main(int argc,char *argv[]) { char buf[200]; int a,b,c; sprintf(buf,"%d:%d:%d",2017,11,25); printf("buf = %s\n",buf); //buf = 2017:11:25 sscanf("2017:11:25","%d:%d:%d",&a,&b,&c); printf("a = %d,b = %d,c = %d\n",a,b,c); //a = 2017,b = 11,c = 25 return 0; }
四.标准I/O库函数
sscanf高级用法
1.跳过数据:%*s或%*d
例如:sscanf("1234 5678","%*d %s",buf); //5678
2.读指定宽度的数据:%[width]s
例如:sscanf("12345678","%4s",buf); //1234
3.支持集合操作
? %[a-z] 表示匹配a到z中任意字符(尽可能多的匹配)
? %[aBc]匹配a、B、c中一员,贪婪性
? %[^a]匹配非a的任意字符,贪婪性 //碰到a就结束
? %[^a-z]表示读取除a-z以外的所有字符 //碰到小写字母就结束了
#include <stdio.h> #include <string.h> int main(int argc,char *argv[]) { char buf[200]; sscanf("1234 5678","%*d %s",buf); printf("buf = %s\n",buf); //buf = 5678 sscanf("12345678","%4s",buf); printf("buf = %s\n",buf); //buf = 1234 sscanf("123abcABC","%[1-9a-z]",buf); printf("buf = %s\n",buf); //buf = 123abc sscanf("123abcABC","%[^A-Z]",buf); printf("buf = %s\n",buf); //buf = 123abc sscanf("123456 abcdef","%[^ ]",buf); printf("buf = %s\n",buf); //buf = 123456 return 0; }
以上是关于字符串处理的主要内容,如果未能解决你的问题,请参考以下文章
在 Python 多处理进程中运行较慢的 OpenCV 代码片段