偏底层的工程项目中,我们经常会遇到要用C语言来直接处理字符串,了解这些函数,编写起代码来能够事半功倍,这也是字符串处理的基础。C语言直接操作内存,所以需要完全理解这些函数在做什么,并且时刻注意安全检查,才能尽量避免一些奇怪的错误(这也是使用C语言的缺点)。一般地,使用这些函数,需要包含头文件:
#include
原型:char *strcpy (char * __dest, const char * __src);
功能:将一个字符串(__src
)拷贝到另一个字符串缓冲区中(__dest
),并返回拷贝后的字符串指针;
例子:
#include
#include
int main(){
const char* str1 = "abcdefg";
char str2[32];
strcpy(str2,str1);
printf("after copy, str2 = %s\n",str2);
return 0;
}
运行结果:
after copy, str2 = abcdefg
注意:
1. 必须保证拷贝后的缓冲区即上例中str2的大小足够,否则造成内存溢出到未分配的地址,容易产生各种未知错误;
2. 由于该函数原理是逐字节复制,所以如果str1和str2的空间有重叠,则会造成覆盖,可以看下面这个例子:
#include
#include
int main(){
char str1[32]="abcdefg";
strcpy(str1+3,str1);
printf("after copy, str1 = %s\n",str1);
return 0;
}
拷贝后的空间和源字符串的空间是有重合的,则源字符串内容会被修改,运行结果为:
after copy, str1 = abcabcdefg
原型:char *strncpy (char * __dest, const char *__src, size_t __n);
功能:将一个字符串(__src
)拷贝到另一个字符串缓冲区中(__dest
),拷贝最多不超过__n
字节,并返回拷贝后的字符串指针;
例子:
#include
#include
int main(){
const char* str1 = "allen junyu";
char str2[32]="anything you can write";
char* p=strncpy(str2,str1,7);
printf("p=%s\n",p);
p[7]=0;
printf("p=%s\n",p);
return 0;
}
运行结果:
p=allen jg you can write
p=allen j
注意: strncpy这个函数并不会自动的在字符串结尾加’\0’,需要我们去增加。
原型:char *strcat (char *__dest, const char *__src);
功能:将一个字符串(__src
)拼接到另一个字符串缓冲区中(__dest
),并返回拼接后的字符串指针;
例子:
#include
#include
int main(){
char str1[32] = "allen";
const char* str2 = "junyu";
char* p=strcat(str1,str2);
printf("p=%s\n",p);
return 0;
}
运行结果:
p=allenjunyu
注意:同样地,需要保证str1有足够的存储空间,否则,程序会顺着内存地址往后写,破坏其他内存数据。
原型:char *strncat (char *__dest, const char *__src, size_t __n);
功能:将一个字符串(__src
)拼接到另一个字符串缓冲区中(__dest
),最多不超过__n
个字节,并返回拼接后的字符串指针;
例子:
#include
#include
int main(){
char str1[32]="allen ";
const char* str2="junyu";
strncat(str1,str2,3);
printf("str1=%s,length=%d\n",str1,strlen(str1));
strncat(str1,str2,1000000);
printf("str1=%s,length=%d\n",str1,strlen(str1));
return 0;
}
运行结果:
str1=allen jun,length=9
str1=allen junjunyu,length=14
原型:size_t strlen (const char *__s);
功能:返回一个字符串(__src
)的长度,即字节(符)数,这里仅考虑ASCII字符;
原型: int strcmp (const char *__s1, const char *__s2);
功能:比较字符串__s1
和字符串__s2
,返回比较结果,如果相等,则返回0;
比较方式:两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇’\0’为止;
返回结果:当s1
s1=s2
时,返回值=0;当s1>s2
时,返回值>0;
例子:
#include
#include
int main(){
const char* str1 = "allen junyu";
char str2[32]="allen junyu";
int ret = strcmp(str1,str2);
printf("ret=%d\n",ret);
return 0;
}
运行结果:
ret=0
原型: int strncmp (const char *__s1, const char *__s2, size_t __n);
功能:比较字符串__s1
和字符串__s2
的__n
个字符,返回比较结果,如果相等,则返回0;
比较方式:同strcmp;
返回结果:同strcmp;
例子:
#include
#include
int main(){
const char* str1 = "allen junyu";
char str2[32]="allen bob";
int ret = strncmp(str1,str2,5);
printf("ret=%d\n",ret);
return 0;
}
运行结果:
ret=0
原型: int strcasecmp (const char *__s1, const char *__s2);
功能:比较字符串__s1
和字符串__s2
,忽略大小写的比较,返回比较结果,如果相等,则返回0;
例子:
#include
#include
int main(){
const char* str1 = "allen";
char str2[32]="AlleN";
int ret = strcasecmp(str1,str2);
printf("strcasecmp ret=%d\n",ret);
return 0;
}
运行结果:
strcasecmp ret=0
原型: int strncasecmp (const char *__s1, const char *__s2, size_t __n);
功能:比较字符串__s1
和字符串__s2
的__n
个字符,忽略大小写的比较,返回比较结果,如果相等,则返回0;
例子:
#include
#include
int main(){
const char* str1 = "allen";
char str2[32]="AlleN junyu";
int ret = strncasecmp(str1,str2,5);
printf("strncasecmp ret=%d\n",ret);
return 0;
}
运行结果:
strncasecmp ret=0