目录
1.求字符串长度函数strlen
函数:size_t strlen ( const char * str );
描述:传入一个字符串(要求字符串以‘\0’结尾),返回字符串中 '\0' 前面出现的字符个数(不包含 '\0' )。需要注意的是,该函数返回值为无符号整型。
使用用例:
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello, World!";
size_t len = strlen(str);
printf("The length of the string is: %zu\n", len);
return 0;
}
模拟实现:
size_t my_strlen(const char* src) {
size_t t = 0;
while (*src++) {
t++;
}
return t;
}
2.字符串拷贝函数strcpy与strncpy
1)strcpy
函数:char* strcpy(char * destination, const char * source );
描述:
destination
:指向目标字符串的指针,表示将要复制到的目标位置。
source
:指向源字符串的指针,表示要复制的源。
strcpy
函数将源字符串中的字符复制到目标字符串中,直到遇到源字符串的'\0',
会将源字符串中的 '\0' 拷贝到目标空间。复制完成后,目标字符串将以'\0'
终止,使其成为一个有效的C字符串。否则需要手动添加一个'\0'。
最后返回目标参数的首地址。
使用用例:
#include <stdio.h>
#include <string.h>
int main() {
char source[] = "Hello, World!";
char destination[20]; // 目标字符串数组需要足够大,以容纳源字符串
strcpy(destination, source);
printf("Source: %s\n", source);
printf("Destination: %s\n", destination);
return 0;
}
在上面的示例中,strcpy
函数将源字符串"Hello, World!"复制到目标字符串数组destination
中。
模拟实现:
char* my_strcpy(char* str, const char* src) {
char* ret = str;
assert(src != NULL);
assert(str != NULL);
while (*str++ = *src++) {
;
}
return ret;
}
2)strncpy
函数:char * strncpy ( char * destination, const char * source, size_t num );
描述:与strcpy不同的是strncpy是从源字符串到目标空间拷贝num个字符,需要注意的是如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。
使用用例:
#include <stdio.h>
#include <string.h>
int main() {
char source[] = "Hello, World!";
char destination[20]; // 目标字符串数组需要足够大,以容纳源字符串
strncpy(destination, source, 5); // 复制源字符串的前5个字符
destination[5] = '\0'; // 手动添加null终止字符
printf("Source: %s\n", source);
printf("Destination: %s\n", destination);
return 0;
}
3.向源字符串后添加字符串strcat与strncat
1)strcat
函数:char *strcat(char *destination, const char *source);
描述:
destination
:指向目标字符串的指针,表示将要连接到的目标位置。
source
:指向源字符串的指针,表示要连接的源。
返回目标字符串的首地址。
strcat
函数将源字符串中的字符追加到目标字符串的末尾,并确保目标字符串以'\0'
终止。追加的操作会一直进行,直到遇到源字符串的null终止字符('\0'
),这里源字符串必须以 '\0' 结束。
使用用例:
#include <stdio.h>
#include <string.h>
int main() {
char destination[50] = "Hello, ";
const char source[] = "World!";
strcat(destination, source);
printf("Concatenated String: %s\n", destination);
return 0;
}
在上面的示例中,strcat
函数将源字符串"World!"连接到目标字符串"Hello, "的末尾,形成了一个新的字符串。输出将显示连接后的字符串。
模拟实现:
char* my_strcat(char* dest, char* src) {
assert(dest);
assert(src);
char* ret = dest;
while (*dest) {
dest++;
}
while (*dest++ = *src++) {
;
}
return ret;
}
2)strncat
函数:char *strncat(char *destination, const char *source, size_t n);
描述:与strcat不同的是n
表示要连接的最大字符数,即从源字符串中复制的字符数。strncat
函数将源字符串中的最多n
个字符追加到目标字符串的末尾。
使用用例:
#include <stdio.h>
#include <string.h>
int main() {
char destination[50] = "Hello, ";
const char source[] = "World!";
strncat(destination, source, 4); // 追加源字符串的前4个字符
printf("Concatenated String: %s\n", destination);
return 0;
}
4.字符串比较函数strcmp与strncmp
1)strcmp
函数:int strcmp(const char *str1, const char *str2);
描述:
str1
:指向第一个要比较的字符串的指针。
str2
:指向第二个要比较的字符串的指针。
strcmp
函数比较两个字符串的内容,并返回一个整数值,表示比较的结果。返回值的含义如下:
- 如果
str1
小于str2
,则返回一个负数(通常是负整数)。 - 如果
str1
等于str2
,则返回0。 - 如果
str1
大于str2
,则返回一个正数(通常是正整数)。
这里首先比较两个字符串的以一个字符,如果相当则比较第二个字符,知道某个字符不同,进而比较不同的两个字符的大小,即为两个字符串的大小。
模拟实现:
int my_strcmp(char* str1, char* str2) {
assert(str1 && str2);
while (*str1 == *str2) {
if (*str1 == '\0') {
return 0;
}
str1++;
str2++;
}
if (*str1 > *str2) {
return 1;
}
else {
return -1;
}
}
2)strncmp
函数:int strncmp(const char *str1, const char *str2, size_t n);
描述:与strcmp不同点在于,n表示
要比较的字符数,表示比较的前n个字符。
使用用例:
#include <stdio.h>
#include <string.h>
int main() {
const char str1[] = "apple";
const char str2[] = "apricot";
int result = strncmp(str1, str2, 3); // 比较前3个字符
if (result == 0) {
printf("The first 3 characters of %s are equal to %s\n", str1, str2);
} else {
printf("The first 3 characters of %s are not equal to %s\n", str1, str2);
}
return 0;
}
在上面的示例中,strncmp
函数比较了两个字符串"apple"和"apricot"的前3个字符,并根据返回值打印出比较结果。因为前3个字符都是相同的,所以strncmp
返回0,输出结果是"The first 3 characters of apple are equal to apricot"。
5.在指定字符串中搜索是否存在某子字符串strstr
函数:char *strstr(const char *haystack, const char *needle);
描述:
haystack
:要在其中查找的主字符串。
needle
:要查找的子字符串。
strstr
函数会在主字符串 haystack
中搜索子字符串 needle
的第一次出现,如果找到匹配,它将返回一个指向 haystack
中匹配子字符串的指针,否则返回 NULL
。
使用实例:
#include <stdio.h>
#include <string.h>
int main() {
const char haystack[] = "Hello, World!";
const char needle[] = "World";
char *result = strstr(haystack, needle);
if (result != NULL) {
printf("Found '%s' in '%s' at position %ld\n", needle, haystack, result - haystack);
} else {
printf("'%s' not found in '%s'\n", needle, haystack);
}
return 0;
}
在上面的示例中,strstr
函数在主字符串 "Hello, World!"
中搜索子字符串 "World"
,找到了匹配,然后返回一个指向匹配子字符串的指针。通过计算指针的偏移,我们可以确定子字符串的位置。输出结果将显示 "Found 'World' in 'Hello, World!' at position 7"
,因为子字符串 "World"
在主字符串中的位置是从索引 7 开始。
模拟实现:
char* my_strstr(char* str1, char* str2) {
char* cp = str1;
char* s1 = cp;
char* s2 = str2;
if (*str2 == '\0') {
return str1;
}
while (*cp) {
s1 = cp;
s2 = str2;
while (*s1 && *s2 && *s1 == *s2) {
s1++;
s2++;
}
if (*s2 == '\0') {
return cp;
}
cp++;
}
return NULL;
}
6.按指定字符分割字符串函数strtok
函数:char *strtok(char *str, const char *delimiters);
描述:
str
:要分割的字符串。第一次调用时,传递要分割的字符串;之后的调用,传递 NULL
。
delimiters
:分隔符字符串,指定用于分割 str
的字符集。
第一个参数指定一个字符串,它包含了0个或者多个由delimiters
字符串中一个或者多个分隔符分割的标记。 strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针(注:strtok函数会改 变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。)
strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。 strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。 如果字符串中不存在更多的标记,则返回 NULL 指针。
使用用例:
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "apple,banana_cherry";
// 第一次调用,分割字符串
char *token = strtok(str, ",_");
while (token != NULL) {
printf("Token: %s\n", token);
token = strtok(NULL, ","); // 后续调用,继续分割
}
return 0;
}
在上面的示例中,strtok
函数首先使用逗号(","
)或("_"
)作为分隔符分割字符串 "apple,banana_cherry"
,然后在循环中逐个提取标记并打印出来。输出结果将显示:
Token: apple
Token: banana
Token: cherry