C语言常用字符串处理函数(一)

C语言常用字符串处理函数(一)

偏底层的工程项目中,我们经常会遇到要用C语言来直接处理字符串,了解这些函数,编写起代码来能够事半功倍,这也是字符串处理的基础。C语言直接操作内存,所以需要完全理解这些函数在做什么,并且时刻注意安全检查,才能尽量避免一些奇怪的错误(这也是使用C语言的缺点)。一般地,使用这些函数,需要包含头文件:

#include <string.h>

1. strcpy

原型:char *strcpy (char * __dest, const char * __src);
功能:将一个字符串(__src)拷贝到另一个字符串缓冲区中(__dest),并返回拷贝后的字符串指针;
例子:

#include <stdio.h>
#include <string.h>

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 <stdio.h>
#include <string.h>

int main(){

    char str1[32]="abcdefg";
    strcpy(str1+3,str1);
    printf("after copy, str1 = %s\n",str1);
    return 0;
}

拷贝后的空间和源字符串的空间是有重合的,则源字符串内容会被修改,运行结果为:

after copy, str1 = abcabcdefg

2. strncpy

原型:char *strncpy (char * __dest, const char *__src, size_t __n);
功能:将一个字符串(__src)拷贝到另一个字符串缓冲区中(__dest),拷贝最多不超过__n字节,并返回拷贝后的字符串指针;
例子:

#include <stdio.h>
#include <string.h>

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’,需要我们去增加。

3. strcat

原型:char *strcat (char *__dest, const char *__src);
功能:将一个字符串(__src)拼接到另一个字符串缓冲区中(__dest),并返回拼接后的字符串指针;
例子:

#include <stdio.h>
#include <string.h>

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有足够的存储空间,否则,程序会顺着内存地址往后写,破坏其他内存数据。

4. strncat

原型:char *strncat (char *__dest, const char *__src, size_t __n);
功能:将一个字符串(__src)拼接到另一个字符串缓冲区中(__dest),最多不超过__n个字节,并返回拼接后的字符串指针;
例子:

#include <stdio.h>
#include <string.h>

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

5. strlen

原型:size_t strlen (const char *__s);
功能:返回一个字符串(__src)的长度,即字节(符)数,这里仅考虑ASCII字符;

6. strcmp

原型: int strcmp (const char *__s1, const char *__s2);
功能:比较字符串__s1和字符串__s2,返回比较结果,如果相等,则返回0;
比较方式:两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇’\0’为止;
返回结果:当s1<s2时,返回值<0;当s1=s2时,返回值=0;当s1>s2时,返回值>0;
例子:

#include <stdio.h>
#include <string.h>

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

7. strncmp

原型: int strncmp (const char *__s1, const char *__s2, size_t __n);
功能:比较字符串__s1和字符串__s2__n个字符,返回比较结果,如果相等,则返回0;
比较方式:同strcmp;
返回结果:同strcmp;
例子:

#include <stdio.h>
#include <string.h>

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

8. strcasecmp

原型: int strcasecmp (const char *__s1, const char *__s2);
功能:比较字符串__s1和字符串__s2,忽略大小写的比较,返回比较结果,如果相等,则返回0;
例子:

#include <stdio.h>
#include <string.h>

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

9. strncasecmp

原型: int strncasecmp (const char *__s1, const char *__s2, size_t __n);
功能:比较字符串__s1和字符串__s2__n个字符,忽略大小写的比较,返回比较结果,如果相等,则返回0;
例子:

#include <stdio.h>
#include <string.h>

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
  • 23
    点赞
  • 91
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值