文章目录
- 一、C 字符串
- 1. 声明和初始化字符串
- 2. 访问字符串中的字符
- 3. 字符串的长度
- 4. 字符串的复制和连接
- 5. 字符串的比较
- 6. 字符串的查找
- 二、C 操作字符串的函数
- 三、相关链接
一、C 字符串
在C语言中,字符串是由字符(包括字母、数字、标点符号等)组成的序列,以空字符(null character,即\0
)作为结尾。在C语言中,字符串不是一种基本的数据类型,但它们通常存储在字符数组(character array)中。
以下是一些关于C字符串的基本概念和示例:
1. 声明和初始化字符串
你可以使用字符数组来存储字符串:
char str[] = "Hello, World!";
// 或者指定数组的大小(包括结尾的空字符)
char str2[14] = "Hello, World!";
注意,在上面的例子中,数组str
和str2
会自动包含结尾的空字符\0
。
2. 访问字符串中的字符
你可以像访问数组中的元素一样访问字符串中的字符:
printf("%c\n", str[0]); // 输出 'H'
3. 字符串的长度
C标准库提供了strlen
函数来计算字符串的长度(不包括结尾的空字符):
#include <string.h>int len = strlen(str); // len现在为13,因为"Hello, World!"有13个字符(不包括结尾的空字符)
4. 字符串的复制和连接
C标准库中的strcpy
函数用于复制一个字符串到另一个字符串:
char dest[20];
strcpy(dest, str); // 现在dest包含了"Hello, World!"
而strcat
函数用于连接两个字符串:
char str3[] = "!";
strcat(str, str3); // 现在str包含了"Hello, World!!"
注意:使用strcpy
和strcat
时要非常小心,因为它们不会检查目标数组是否有足够的空间来存储结果字符串,这可能会导致缓冲区溢出。为了避免这种情况,你可以使用更安全的函数,如strncpy
和strncat
。
5. 字符串的比较
C标准库中的strcmp
函数用于比较两个字符串:
int result = strcmp(str, "Hello, World!"); // result现在为0,因为两个字符串相等
strcmp`函数返回的值是一个整数,表示两个字符串的字典顺序关系。如果返回值小于0,则第一个字符串在字典顺序上小于第二个字符串;如果返回值大于0,则第一个字符串在字典顺序上大于第二个字符串;如果返回值等于0,则两个字符串相等。
6. 字符串的查找
C标准库中的strstr
函数用于在一个字符串中查找另一个字符串的首次出现:
char *pos = strstr(str, "World"); // pos现在指向str中"World"的起始位置,或者如果找不到则为NULL
二、C 操作字符串的函数
在 C 语言中,处理字符串通常涉及到一系列标准库函数,这些函数定义在 <string.h>
头文件中。以下是一些常用的 C 语言字符串操作函数:
- 字符串长度
size_t strlen(const char *str);
返回字符串str
的长度(不包括结尾的空字符'\0'
)。
- 字符串复制
char *strcpy(char *dest, const char *src);
将字符串src
复制到dest
所指向的位置,包括结尾的空字符。char *strncpy(char *dest, const char *src, size_t n);
将字符串src
的前n
个字符复制到dest
所指向的位置,但不会添加空字符(除非src
的长度小于n
)。
- 字符串连接
char *strcat(char *dest, const char *src);
将字符串src
添加到dest
字符串的末尾,包括两个字符串末尾的空字符。char *strncat(char *dest, const char *src, size_t n);
将字符串src
的前n
个字符添加到dest
字符串的末尾,确保dest
字符串以空字符结尾。
- 字符串比较
int strcmp(const char *str1, const char *str2);
比较两个字符串。如果str1
小于str2
,则返回负值;如果相等,则返回 0;如果str1
大于str2
,则返回正值。int strncmp(const char *str1, const char *str2, size_t n);
比较两个字符串的前n
个字符。
- 字符串查找
char *strstr(const char *haystack, const char *needle);
在haystack
字符串中查找needle
字符串首次出现的位置。如果找到,返回指向首次出现位置的指针;否则返回NULL
。
- 字符串分割
- C 标准库没有直接的字符串分割函数,但可以使用
strtok
函数:char *strtok(char *str, const char *delim);
在str
字符串中查找由delim
指定的分隔符,并返回指向第一个标记的指针。这个函数通常与NULL
一起使用,以便在后续调用中继续查找剩余标记。
- 字符串大小写转换
- C 标准库没有直接的字符串大小写转换函数,但可以使用
toupper
和tolower
函数逐个字符转换:int toupper(int c);
如果c
是小写字母,则返回对应的大写字母;否则返回c
。int tolower(int c);
如果c
是大写字母,则返回对应的小写字母;否则返回c
。
- 内存设置
void *memset(void *str, int c, size_t n);
将str
所指向的内存区域的前n
个字节设置为c
的值。这通常用于初始化字符串或设置特定值。
- 内存移动和复制
void *memmove(void *dest, const void *src, size_t n);
从src
所指向的内存区域复制n
个字节到dest
所指向的内存区域。与memcpy
不同,memmove
可以处理源区域和目标区域重叠的情况。void *memcpy(void *dest, const void *src, size_t n);
从src
所指向的内存区域复制n
个字节到dest
所指向的内存区域。
三、相关链接
- Visual Studio Code下载地址
- Sublime Text下载地址
- 「C系列」C 简介
- 「C系列」C 基本语法
- 「C系列」C 数据类型
- 「C系列」C 变量及常见问题梳理
- 「C系列」C 常量
- 「C系列」C 存储类
- 「C系列」C 运算符
- 「C系列」C 判断/循环
- 「C系列」C 函数
- 「C系列」C 作用域规则
- 「C系列」C 数组
- 「C系列」C enum(枚举)
- 「C系列」C 指针及其应用案例