C/C++字符串使用整理

C++字符串函数使用整理

在编写程序时,我们常常要面对字符串的使用。字符串库中包含着许多的函数可以帮助我们较为简便地解决问题。

字符串操作相关的函数的具体实现以及算法分析

  • 1、strcpy

函数原型:char *strcpy(char *dest, const char *src) 

函数功能:将源字符串src的内容复制到目的字符串dest中,并返回指向目的字符串dest的指针。

注意:要求dest字符串长度要大于或等于src长度,否则会越界。复制时会将src的结束符'\0'也复制到dest中。

测试:

int main(){
char s1[]="1234567";
char s2[]="abcd";
cout<<strcpy(s1,s2)<<endl<<s1[6];
}
//输出如下
abcd
7

 


这说明了s2的结束符也复制到s1中了。复制之后s1中变为 a b c d \0 6 7 \0

函数实现:

char *mystrcpy(char *dest, const char *src){
assert(dest!=NULL && src!=NULL);
char *destCopy=dest;
while((*dest++=*src++)!='\0'); //此处已经将src的结束符复制到了dest中
return destCopy;
}
assert宏,其用法是"assert(表达式)",当表达式为假时强行中止程序,并给出错误提示。需要头文件#include <cassert>
while这一行程序也可以这么写:

while(*src!='\0'){ //相当于while(*src)
*dest++=*src++;
}
*dest='\0'; //在目标字符串结尾加结束符

 


 

  • 2、strncpy

函数原型:char *mystrncpy(char *dest, const char *src, int count)

函数功能:将源字符串src的前count个字符复制到dest中

注意:src的前count个字符将会覆盖dest的相应字符。src的结束符可能被复制进去,这点见下面测试。

测试1:

int main(){
char s1[]="12345678";
char s2[]="abcd";
cout<<strncpy(s1,s2,4)<<endl;
}
//输出如下
abcd5678
测试2:
int main(){
char s1[]="12345678";
char s2[]="abcd";
cout<<strncpy(s1,s2,5)<<endl;
}
//输出如下
abcd

 


测试1和测试2的区别就是是否把s2的结束符复制到s1中了。
函数实现:

char *mystrncpy(char *dest, const char *src, int count){
assert(dest!=NULL && src!=NULL);
char *destCopy=dest;
while(count--&&(*dest++=*src++)!='\0');
return destCopy;
}

 


 

  • 3、strcat
strcat的用法是将两个char类型连接。
char d[20]="Golden";
char s[20]="View";
strcat(d,s);
//打印d
printf("%s",d);

 

输出 d 为 GoldenView (中间无空格)
d和s所指内存区域不可以重叠且d必须有足够的空间来容纳s的字符串。
返回指向d的指针


strcat函数实现:

char *mystrcat(char *dest, const char *src){
assert(dest!=NULL && src!=NULL);
char *destCopy=dest;
while(*dest!='\0')
dest++;
while((*dest++=*src++)!='\0');
return destCopy;
}

 

 


 

  • 4、strcmp
C/C++函数,比较两个字符串
设这两个字符串为str1,str2,
若str1=str2,则返回零;
若str1<str2,则返回负数;
若str1>str2,则返回正数。
matlab中函数,strcmp(s1,s2) 判断两个字符串s1和s2是否相同,相同返回true ,不同返回false。
 


strcmp函数实现:

int mystrcmp(const char *firstStr, const char *secondStr){
assert(firstStr!=NULL && secondStr!=NULL);
while(*firstStr&&*secondStr&&*firstStr==*secondStr){
firstStr++; //只有两字符相等时才往后挪
secondStr++;
}
return (*firstStr-*secondStr);
}

 


上面程序中while循环如果写成while(*firstStr&&*secondStr&&*firstStr++==*secondStr++)是错的。因为这样的话碰到不相等的字符也往后挪了一位再进行下面的return比较。

 


 

  • 5、strlen

strlen所作的仅仅是一个计数器的工作

它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描

直到碰到第一个字符串结束符'\0'为止,然后返回计数器值。

实现如下:

int mystrlen(const char *str){
int count=0;
while(*str!='\0'){
str++;
count++;
}
return count;
}

 


 

 

  • 6、strchr

strchr是计算机编程语言的一个函数

原型为extern char *strchr(const char *s,char c)

可以查找字符串s中首次出现字符c的位置。
测试:

char s1[100]="12345678";
cout<<strchr(s1,'4')<<endl;
//output
45678

 

返回的是指向所给字符的指针


strchr函数实现:

char *mystrchr(char *str, int c){
assert(str!=NULL);
while(*str++!='\0'){
if(*str==(char)c)
return str;
}
return NULL;
}

 


 

  • 7、strpbrk

函数功能:strpbrk是在源字符串(s1)中找出最先含有搜索字符串(s2)中任一字符的位置并返回,若找不到则返回空指针。

测试:

char s1[100]="12345678";
char s2[]="002001";
cout<<strpbrk(s1,s2)<<endl;
//output
12345678

char s1[100]="12345678";
char s2[]="00200";
cout<<strpbrk(s1,s2)<<endl;
//output
2345678


strpbrk函数实现:

char *mystrpbrk(char *str1, char *str2){
while(*str1!='\0'){
if(strchr(str2,*str1)!=NULL)
return str1;
str1++;
}
return NULL;
}

以上就是我近期以来对字符串函数使用的一些整理及归纳。参考了CSDN及博客园的一些相关文章,并从中学到了许多。希望能和大家一起分享学习。

 

posted @ 2019-05-04 19:25  sherlock/holmes  阅读(254)  评论(0编辑  收藏  举报