字符串操作函数整理

字符串操作函数

程序按功能划分可分为数值运算符号处理I/O操作三类,符号处理程序占相当大的比例,符号处理程序无处不在,编译器、浏览器、Office套件等程序的主要功能都是符号处理。无论多复杂的符号处理都是由各种基本的字符串操作组成的,这里简单介绍如何用C语言的库函数做字符串初始化取长度拷贝连接比较搜索等基本操作。

1.初始化字符串

#include <string.h>

void *memset (void *s, int c, size_t n);

返回值: s指向哪,返回的指针就指向哪.

memset函数把s所指的内存地址开始的n个字节都填充为c的值. 通常c的值为0, 把一块内存区清零. 例如定义 char buf[10]; , 如果它是全局变量或静态变量, 则自动初始化为0 (位于.bss 段,[汇编里面的,不太记得了!]), 如果它是函数的局部变量, 则初值不确定, 可以用 memset(buf, 0, 10)清零, 有malloc分配的内存初值也是不确定的, 也可以用 memset清零.


2.取字符串的长度

#include <string.h>

size_t strlen (const char *s);

返回值: 字符串的长度.

strlen函数返回s所指的字符串的长度。该函数从s所指的第一个字符开始找'\0'字符,一旦找到就返回,返回的长度不包括'\0'字符在内。例如定义char buf[] = "hello";,则strlen(buf)的值是5,但要注意,如果定义char buf[5] = "hello";,则调用strlen(buf)是危险的,会造成数组访问越界。

3.拷贝字符串

strcpystrncpy函数, memcpymemmove函数!

strcpystrncpy函数,拷贝以'\0'结尾的字符串strncpy还带一个参数指定最多拷贝多少个字节,此外,strncpy并不保证缓冲区以'\0'结尾。现在介绍memcpy和memmove函数.

#include <string.h>

void *memcpy (void *dest, const void *src, size_t n);

void *memmove (void *dest, const void *src, size_t n);

返回值: dest指向哪, 返回的指针就指向哪. 

memcpy函数src所指的内存地址拷贝n个字节dest所指的内存地址, 和strncpy不同,memcpy并不是遇到'\0'就结束, 而是一定会拷贝完n个字节.  这里的命名规律是: str开头的函数处理以'\0'结尾的字符串, 而以mem开头的函数则不关心'\0'字符, 或者说这些函数并不把参数当字符串看待,因此参数的指针类型void *非char *

memmove也是从src所指的内存地址拷贝n个字节到dest所指的内存地址, 虽然叫move但其实也是拷贝而非移动. 但是和memcpy有一点不同,memcpy两个参数src和dest所指的内存区间如果重叠无法保证正确拷贝,而memmove却可以正确拷贝.


memmove可以这样实现:

void * memmove (void *dest, const void *src, size_t n)

{

chartemp[n];

int i;

char *d = dest;

const char *s =src;

for ( i = 0; i < n; i++ )

temp[i] = s[i];

for ( i = 0; i < n; i++)

d[i] = temp[i];

returndest;

}

借助于一个临时缓冲区temp, 即使src和dest所指的内存区间有重叠也能正确拷贝.


4.连接字符串

strcat和strncat函数.

#include <string.h>

char *strcat(char *dest, const char *src);

char *strncat(char *dest, const char *src, size_t n);

返回值: dest指向哪,返回的指针就指向哪.

strcat 把 src 所指的字符串连接到dest所指的字符串后面,例如:

char d[10] = "foo";

char s[10] = "bar";

strcat(d,s);

printf("%s %s\n", d, s);

调用strcat函数后, 缓冲区s的内容没有变,缓冲区d中保存着字符串"foobar", 注意原来 "foo" 后面的 '\0' 被连接上来的字符串 "bar" 覆盖掉了, "bar" 后面的 '\0' 仍保留!!

5.比较字符串

memcmp, strcmp和strncmp函数.

6.搜索字符串

strchr和strnchr函数.

strstr函数.

7.分割字符串

strtok和strtok_r函数.


///突然有一种翱翔于这些字节之间, 详情参考: linux一站式编程! 看完它, 我才觉得我懂了一点点C!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值