字符串
1️⃣概述
-
字符串指的是零个或多个字符的序列,并且以 ‘\0’ (ASCII 0)结尾
-
C语言里并没有字符串的数据类型,字符串都是存放在字符型数组中的
-
下面3种定义字符串的方法是等价的
char str[] = {'m','o','n','e','y','\0'}; char str[] = "money"; // 系统自动在最后补一个'\0' char *str = "money";
2️⃣字符操作
- 标准库包含了两组函数,用于操作单独的字符,它们的原型位于头文件ctype.h中。第一组函数用于对字符分类,而第2组函数用于转换字符。
字符分类
- 每个分类函数接受一个包含字符值的整型参数。函数测试这个字符并返回一个整型值,表示真或假。(注意,标准并未指定任何特定值,所以有可能返回任何非零值。)
- 下表列出了这些分类函数以及它们每个所执行的测试:
函数 | 如果它的参数符合下列条件就返回真 |
---|---|
iscntrl | 任何控制字符 |
isspace | 空白字符:空格‘ ’,换页‘\f’,换行’\n’,回车’\r’,制表符’\t’,或垂直制表符’\v’ |
isdigit | 十进制数字0~9 |
isxdigit | 十六进制数字,包括所有十进制数字,小写字母af,大写字母AF |
islower | 小写字母a~z |
isupper | 大写字母A~Z |
isalpha | 字母a~ z或A~Z |
isalnum | 字母或数字a~ z,A~ Z或0~9 |
ispunct | 标点符号,任何不属于数字或字母的图像字符(可打印符号) |
isgraph | 任何图像字符 |
isprint | 任何可打印字符,包括图像字符和空白字符 |
字符转换
-
转换函数把大写字母转换为小写字母或者把小写字母转换为大写字母。
int tolower( int ch ); int toupper( int ch);
-
toupper 函数返回其参数的对应大写形式,tolower函数返回其参数对应的小写形式。如果函数的参数并不是处于适当大小写状态的字符(即toupper的参数不是小写字母或tolower的参数不是大写字母),函数将不修改参数直接返回。
3️⃣常用字符串函数str✨
include< string.h>
计算长度strlen
size_t strlen( char *str );
/********************************************************
*功能:
计算字符串str的长度
*参数:
str - 要计算大小的字符串
*返回值:
str的长度
********************************************************/
拷贝strcpy&strncpy
char *strcpy(char * to , const char * from);
/********************************************************
*功能:
复制字符串from中的字符到字符串to,包括空值和结束符
*参数:
to - 要拷贝到的字符串
from - 被拷贝的字符串
*返回值:
指针to
********************************************************/
char *strncpy(char *dest, const char *src, size_t n);
/********************************************************
*功能:
把 src 所指向的字符串复制到 dest,最多复制 n 个字符。当 src 的长度小于 n 时,dest 的剩余部分将用空字节填充
*参数:
dest – 指向用于存储复制内容的目标数组。
src – 要复制的字符串。
n – 要从源中复制的字符数
*返回值:
指针dest
********************************************************/
比较strcmp&strncmp
int strcmp ( const char * str1 , const char * str2 );
/********************************************************
*功能:
比较字符串的str1和字符串str2(按ASCII码)
*参数:
str1、str2 - 要比较的两个字符串
*返回值:
str1 < str2,返回小于0的值
str1 = str2,返回 0
str1 > str2,返回大于0的值
********************************************************/
int strncmp( const char *str1, const char *str2, size_t count );
/********************************************************
*功能:
比较字符串的str1和字符串str2的前count个字符;若有一字符串长度小于count ,则比较到小字符串大小结束
*参数:
str1、str2 - 要比较的两个字符串
count - 要比较的长度
*返回值:
str1 < str2,返回小于0的值
str1 = str2,返回 0
str1 > str2,返回大于0的值
********************************************************/
拼接strcat
char * strcat(char * str1 ,char * str2 );
/********************************************************
*功能:
函数把字符串str2拼接到str1的末端
*参数:
str1 - 前面的字符串
str2 - 后面的字符串
*返回值:
指针str1
********************************************************/
查找字符strchr
char * strchr()const char * str, char ch);
/********************************************************
*功能:
找到字符串中的某个字符
*参数:
str - 要检索的字符串
ch - 要寻找的字符
*返回值:
ch首次出现的位置,如果没有找到ch返回NULL
********************************************************/
查找子串strstr
char *strstr(char *str1, const char *str2);
/********************************************************
*功能:
找到字符串中的子串
*参数:
str1 - 要检索的字符串
str2 - 要寻找的子串
*返回值:
若str2是str1的子串,则返回str2在str1的首次出现的地址;如果str2不是str1的子串,则返回NULL
********************************************************/
字符串分割strtok
char *strtok(char *str, const char *delim);
/********************************************************
*功能:
分解字符串 str 为一组字符串
*参数:
str - 要分割的字符串
delim - 分隔符
*返回值:
从str开头开始的一个个被分割的串。当没有被分割的串时则返回NULL。
********************************************************/
- 第一次之后的调用将参数str设置成NULL即可
4️⃣内存操作mem
- 根据字符串的规定,结尾为一个空字符NUL,所以字符串内部不包含NUL。但是非字符串数据包含0值的情况并不罕见,此时我们需要使用一组mem开头的函数来处理这种情况。
- 此系列函数也包括在头文件string.h内
memcpy
void *memcpy(void *str1, const void *str2, size_t n);
/********************************************************
*功能:
* 从str2复制n个字符到str1,当str1和str2重叠时结果未定义
*参数:
* str1 – 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。
* str2 – 指向要复制的数据源,类型强制转换为 void* 指针。
* n – 要被复制的字节数。
*返回值:
* 指针str1
********************************************************/
memmove
void *memmove(void *str1, const void *str2, size_t n)
/********************************************************
*功能:
* 从str2复制n个字符到str1,当str1和str2重叠时函数正常
*参数:
* str1 – 指向用于存储复制内容的目标数组,类型强制转换为 void* 指针。
* str2 – 指向要复制的数据源,类型强制转换为 void* 指针。
* n – 要被复制的字节数。
*返回值:
* 指针str1
********************************************************/
memcmp
int memcmp(const void *str1, const void *str2, size_t n)
/********************************************************
*功能:
* 把存储区 str1 和存储区 str2 的前 n 个字节进行比较。
*参数:
* str1、str2 – 指向两个内存块的指针。
* n – 要被比较的字节数。
*返回值:
* str1 < str2,返回小于0的值
* str1 = str2,返回 0
* str1 > str2,返回大于0的值
********************************************************/
memchr
void *memchr(const void *str, int c, size_t n)
/********************************************************
*功能:
* 在参数str所指向的字符串的前n个字节中搜索第一次出现字符c的位置。
*参数:
* str - 要检索的字符串
* c - 要寻找的字符
* n – 要查找的字节数。
*返回值:
* c首次出现的位置,如果没有找到ch返回NULL
********************************************************/
⭐️memset⭐️
- 此函数经常用于字符串的初始化
void *memset(void *str, int c, size_t n)
/********************************************************
*功能:
* 复制字符 c 到参数 str 所指向的字符串的前 n 个字符
*参数:
* str - 要填充的内存块
* c - 要被填充的值。该值以 int 形式传递,但是函数在填充内存块时使用该值的无符号字符型。
* n – 要填充的字节数。
*返回值:
* 无
********************************************************/