字符串操作函数整理

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

字符串操作函数

程序按功能划分可分为数值运算符号处理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!

目录
相关文章
|
5月前
|
算法 C语言
【再识C进阶3(上)】详细地认识字符串函数、进行模拟字符串函数以及拓展内容
【再识C进阶3(上)】详细地认识字符串函数、进行模拟字符串函数以及拓展内容
|
6月前
|
存储 程序员 Go
常用函数整理(基础篇)
常用函数整理(基础篇)
208 2
常用函数整理(基础篇)
|
3月前
|
存储 安全 编译器
【C语言篇】字符和字符串以及内存函数的详细介绍与模拟实现(上篇)
当然可以用scanf和printf输入输出,这里在之前【C语言篇】scanf和printf万字超详细介绍(基本加拓展用法)已经讲过了,这里就不再赘述,主要介绍只针对字符的函数.
55 0
|
5月前
|
C语言
C语言常用函数整理
C语言常用函数整理
|
6月前
|
算法 前端开发
1544. 整理字符串
1544. 整理字符串
42 0
|
6月前
|
网络协议 NoSQL Linux
知识巩固源码落实之6:c语言拼接字符串与切割字符串(strsep)代码
知识巩固源码落实之6:c语言拼接字符串与切割字符串(strsep)代码
107 0
|
C语言 C++
C语言进阶学习日志 字符串与内存函数(二)
C语言进阶学习日志 字符串与内存函数(二)
102 0
|
存储 安全 C语言
C语言进阶学习日志:字符串和内存函数(一)(下)
C语言进阶学习日志:字符串和内存函数(一)(下)
84 0
|
存储 C语言
C语言进阶学习日志:字符串和内存函数(一)(上)
C语言进阶学习日志:字符串和内存函数(一)
122 0
|
编译器 Serverless C语言
【C语言进阶】字符串函数与内存函数的学习与模拟实现(上)
【C语言进阶】字符串函数与内存函数的学习与模拟实现(上)