目录
在编程中,字符串操作是非常常见的任务,特别是在处理文本数据时。以下是一些常用的字符串操作函数,主要是 C 标准库中的函数:
字符串操作函数分类
1. 字符串长度和复制
-
strlen
: 计算字符串的长度。size_t strlen(const char *str);
-
strcpy
: 复制字符串。char *strcpy(char *dest, const char *src);
-
strncpy
: 复制指定长度的字符串。char *strncpy(char *dest, const char *src, size_t n);
2. 字符串连接
-
strcat
: 连接字符串。char *strcat(char *dest, const char *src);
-
strncat
: 连接指定长度的字符串。char *strncat(char *dest, const char *src, size_t n);
3. 字符串比较
-
strcmp
: 比较字符串。int strcmp(const char *str1, const char *str2);
-
strncmp
: 比较指定长度的字符串。int strncmp(const char *str1, const char *str2, size_t n);
4. 字符串查找
-
strchr
: 查找字符在字符串中首次出现的位置。char *strchr(const char *str, int c);
-
strrchr
: 查找字符在字符串中最后一次出现的位置。char *strrchr(const char *str, int c);
-
strstr
: 查找子字符串在字符串中首次出现的位置。char *strstr(const char *haystack, const char *needle);
5. 字符串转换
-
atoi
: 将字符串转换为整数。int atoi(const char *str);
-
atol
: 将字符串转换为长整数。long int atol(const char *str);
-
atof
: 将字符串转换为浮点数。double atof(const char *str);
-
strtol
: 将字符串转换为长整数,具有错误处理。long int strtol(const char *str, char **endptr, int base);
-
strtoul
: 将字符串转换为无符号长整数,具有错误处理。unsigned long int strtoul(const char *str, char **endptr, int base);
-
strtod
: 将字符串转换为双精度浮点数,具有错误处理。double strtod(const char *str, char **endptr);
6. 字符串复制和移动
-
memcpy
: 复制内存块。void *memcpy(void *dest, const void *src, size_t n);
-
memmove
: 移动内存块。void *memmove(void *dest, const void *src, size_t n);
7. 字符串填充和比较
-
memset
: 填充内存块。void *memset(void *s, int c, size_t n);
-
memcmp
: 比较内存块。int memcmp(const void *s1, const void *s2, size_t n);
字符串操作函数使用
1. strlen
函数
功能: 计算字符串的长度(不包括末尾的空字符'\0'
)。
原型: size_t strlen(const char *str);
使用示例:
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello, world!";
size_t len = strlen(str);
printf("Length of the string is: %zu\n", len);
return 0;
}
注意事项:
- 确保字符串是以空字符
'\0'
结尾的。如果字符串没有正确地终止,strlen
可能会继续读取内存中的数据,直到遇到一个空字符,导致未定义行为。 - 使用
strlen
的结果时注意防止越界访问。
2. strcpy
函数
功能: 将源字符串复制到目标字符串中(包括末尾的空字符'\0'
)。
原型: char *strcpy(char *dest, const char *src);
使用示例:
#include <stdio.h>
#include <string.h>
int main() {
char src[] = "Hello, world!";
char dest[50]; // 确保目标数组足够大以容纳源字符串
strcpy(dest, src);
printf("Copied string is: %s\n", dest);
return 0;
}
注意事项:
- 目标字符串
dest
必须有足够的空间来容纳源字符串src
,包括终止的空字符'\0'
。如果dest
空间不足,会导致缓冲区溢出,可能引发安全漏洞。 - 推荐使用更安全的
strncpy
函数,指定最大复制字符数。
3. strcat
函数
功能: 将源字符串追加到目标字符串的末尾(目标字符串必须有足够的空间容纳新字符串)。
原型: char *strcat(char *dest, const char *src);
使用示例:
#include <stdio.h>
#include <string.h>
int main() {
char dest[50] = "Hello, ";
char src[] = "world!";
strcat(dest, src);
printf("Concatenated string is: %s\n", dest);
return 0;
}
注意事项:
- 目标字符串
dest
必须有足够的空间来容纳原有的内容和源字符串src
以及终止的空字符'\0'
。如果dest
空间不足,会导致缓冲区溢出。 - 推荐使用更安全的
strncat
函数,指定最大追加字符数。
4. strcmp
函数
功能: 比较两个字符串的大小。
原型: int strcmp(const char *str1, const char *str2);
返回值:
- 如果
str1
等于str2
,返回0
。 - 如果
str1
小于str2
,返回负值。 - 如果
str1
大于str2
,返回正值。
使用示例:
#include <stdio.h>
#include <string.h>
int main() {
char str1[] = "Hello";
char str2[] = "World";
int result = strcmp(str1, str2);
if (result == 0) {
printf("The strings are equal.\n");
} else if (result < 0) {
printf("The first string is less than the second string.\n");
} else {
printf("The first string is greater than the second string.\n");
}
return 0;
}
注意事项:
strcmp
返回一个整数,根据返回值判断字符串的大小关系。strcmp
比较时区分大小写。如果需要不区分大小写的比较,可以使用strcasecmp
或stricmp
函数(具体函数名称根据系统有所不同)。
5. strncpy
函数
功能: 将指定长度的字符从源字符串复制到目标字符串。
原型: char *strncpy(char *dest, const char *src, size_t n);
使用示例:
#include <stdio.h>
#include <string.h>
int main() {
char src[] = "Hello, world!";
char dest[50];
strncpy(dest, src, 5); // 只复制前5个字符
dest[5] = '\0'; // 手动添加终止符
printf("Copied string is: %s\n", dest);
return 0;
}
注意事项:
strncpy
不一定会在目标字符串末尾添加终止的空字符'\0'
,如果源字符串长度大于或等于指定长度n
,需要手动添加'\0'
。- 使用时要确保目标字符串有足够的空间存放指定长度的字符及可能的终止符。
6. strncat
函数
功能: 将指定长度的字符从源字符串追加到目标字符串的末尾。
原型: char *strncat(char *dest, const char *src, size_t n);
使用示例:
#include <stdio.h>
#include <string.h>
int main() {
char dest[50] = "Hello, ";
char src[] = "world!";
strncat(dest, src, 3); // 只追加前3个字符
printf("Concatenated string is: %s\n", dest);
return 0;
}
注意事项:
strncat
追加的字符数不包括终止的空字符'\0'
,但会自动在末尾添加一个空字符。因此,目标字符串需要有足够的空间。- 使用时要注意源字符串和追加的字符数,以及目标字符串的剩余空间。
7. strncmp
函数
功能: 比较两个字符串的前n个字符。
原型: int strncmp(const char *str1, const char *str2, size_t n);
使用示例:
#include <stdio.h>
#include <string.h>
int main() {
char str1[] = "Hello";
char str2[] = "Helium";
int result = strncmp(str1, str2, 3); // 比较前3个字符
if (result == 0) {
printf("The first 3 characters of the strings are equal.\n");
} else if (result < 0) {
printf("The first 3 characters of the first string are less than the second string.\n");
} else {
printf("The first 3 characters of the first string are greater than the second string.\n");
}
return 0;
}
注意事项:
strncmp
只比较指定长度的字符,如果两个字符串在指定长度内相同,返回0
,否则返回正值或负值。- 使用时要确保比较的长度不会超出字符串实际长度。
8. strchr
函数
功能: 查找字符串中首次出现的字符。
原型: char *strchr(const char *str, int c);
使用示例:
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello, world!";
char *ptr = strchr(str, 'o');
if (ptr) {
printf("First occurrence of 'o' is at position: %ld\n", ptr - str);
} else {
printf("'o' not found in the string.\n");
}
return 0;
}
注意事项:
strchr
查找的字符在字符串中首次出现的位置,如果未找到则返回NULL
。- 使用返回的指针时要检查是否为
NULL
,以避免访问非法内存。
9. strrchr
函数
功能: 查找字符串中最后一次出现的字符。
原型: char *strrchr(const char *str, int c);
使用示例:
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello, world!";
char *ptr = strrchr(str, 'o');
if (ptr) {
printf("Last occurrence of 'o' is at position: %ld\n", ptr - str);
} else {
printf("'o' not found in the string.\n");
}
return 0;
}
注意事项:
strrchr
查找的字符在字符串中最后一次出现的位置,如果未找到则返回NULL
。- 使用返回的指针时要检查是否为
NULL
,以避免访问非法内存。
10. strstr
函数
功能: 查找子字符串在字符串中首次出现的位置。
原型: char *strstr(const char *haystack, const char *needle);
使用示例:
#include <stdio.h>
#include <string.h>
int main() {
char haystack[] = "Hello, world!";
char needle[] = "world";
char *ptr = strstr(haystack, needle);
if (ptr) {
printf("Substring found at position: %ld\n", ptr - haystack);
} else {
printf("Substring not found.\n");
}
return 0;
}
注意事项:
strstr
查找子字符串在字符串中首次出现的位置,如果未找到则返回NULL
。- 使用返回的指针时要检查是否为
NULL
,以避免访问非法内存。