1.strlen
1.1 用法
我们模拟实现第一步是不是应该先了解它的用法呢
strlen
是 C 语言标准库中的一个函数,用于计算字符串的长度(即字符个数)。它的原型定义在头文件 string.h
中。
下面是 strlen
函数的原型:
#include <string.h> size_t strlen(const char *str);
其中,str
是需要计算长度的字符串,返回值是 size_t
类型,表示字符串的长度。
strlen
函数会从字符串的开头开始遍历,直到遇到字符串结束符 \0
才停止,并返回遍历过程中统计的字符个数(不包括结束符)。
#include <stdio.h>
#include <string.h>
int main() {
char str[] = "Hello, World!";
size_t len = strlen(str);
printf("Length of the string: %zu\n", len);
return 0;
}
1.2 模拟实现
然我们来验证一下呗
我们实现了两个版本的strlen,其实还有一种,指针减指针的方法,就留给你们去实现喽。
2.strcpy
2.2 用法
strcpy
是 C 语言标准库中的一个函数,用于将一个字符串复制到另一个字符串中。它的原型定义在头文件 string.h
中。
下面是 strcpy
函数的原型:
#include <string.h> char *strcpy(char *dest, const char *src);
其中,dest
是目标字符串(要复制到的字符串),src
是源字符串(要被复制的字符串)。返回值是指向目标字符串 dest
的指针。
strcpy
函数会将源字符串 src
的内容复制到目标字符串 dest
中,直到遇到源字符串的结束符 \0
为止。需要注意的是,如果目标字符串 dest
不够大,无法容纳源字符串 src
的内容,可能会导致缓冲区溢出的问题。所以铁汁们,知道怎么使用了吗?
#include <stdio.h>
#include <string.h>
int main() {
char src[] = "Hello, World!";
char dest[20];
strcpy(dest, src);
printf("Original string: %s\n", src);
printf("Copied string: %s\n", dest);
return 0;
}
2.2模拟实现
下一个,
3.strcat
3.1 用法
strcat
是 C 语言标准库中的一个函数,用于将一个字符串追加到另一个字符串的末尾。它的原型定义在头文件 string.h
中。
下面是 strcat
函数的原型:
#include <string.h> char *strcat(char *dest, const char *src);
其中,dest
是目标字符串(要追加到的字符串),src
是源字符串(要被追加的字符串)。返回值是指向目标字符串 dest
的指针。
strcat
函数会将源字符串 src
的内容追加到目标字符串 dest
的末尾,并在追加后的字符串末尾添加结束符 \0
。需要注意的是,如果目标字符串 dest
的空间不足以容纳源字符串 src
的内容,可能会导致缓冲区溢出的问题。
#include <stdio.h>
#include <string.h>
int main() {
char dest[50] = "Hello, ";
char src[] = "World!";
strcat(dest, src);
printf("Concatenated string: %s\n", dest);
return 0;
}
3.2 模拟实现
4.strstr
4.1 用法
strstr
是 C 语言标准库中的一个函数,用于在一个字符串中查找第一次出现另一个字符串的位置。它的原型定义在头文件 string.h
中。
下面是 strstr
函数的原型:
#include <string.h> char *strstr(const char *haystack, const char *needle);
其中,haystack
是要被搜索的字符串(被搜索的字符串),needle
是要搜索的字符串(要查找的子字符串)。返回值是指向第一次匹配到的子字符串的指针,如果未找到,则返回 NULL
。
strstr
函数会在 haystack
字符串中查找第一次出现 needle
字符串的位置,并返回该位置的指针。如果未找到 needle
字符串,则返回 NULL
。
#include <stdio.h>
#include <string.h>
int main() {
const char *haystack = "Hello, World! This is a test.";
const char *needle = "World";
char *result = strstr(haystack, needle);
if (result != NULL) {
printf("'%s' found at position: %ld\n", needle, result - haystack);
} else {
printf("'%s' not found in '%s'\n", needle, haystack);
}
return 0;
}
4.2 模拟实现
5.strncpy
5.1 用法
strncpy
是 C 语言标准库中的一个函数,用于将指定长度的字符串从源字符串复制到目标字符串中。与 strcpy
不同的是,strncpy
允许指定要复制的字符数,即使源字符串的长度超过指定的字符数。这可以避免缓冲区溢出的问题。
下面是 strncpy
函数的原型:
#include <string.h> char *strncpy(char *dest, const char *src, size_t n);
其中,dest
是目标字符串(要复制到的字符串),src
是源字符串(要被复制的字符串),n
是要复制的字符数。返回值是指向目标字符串 dest
的指针。
strncpy
函数会将源字符串 src
的最多前 n
个字符复制到目标字符串 dest
中,如果 src
的长度小于 n
,则剩余的部分会用空字符 \0
进行填充;如果src
的长度大于等于 n
,则只会复制 n
个字符
#include <stdio.h>
#include <string.h>
int main() {
char src[] = "Hello, World!";
char dest[20];
strncpy(dest, src, 5); // 只复制前 5 个字符
dest[5] = '\0'; // 手动添加字符串结束符
printf("Original string: %s\n", src);
printf("Copied string: %s\n", dest);
return 0;
}
5.2 模拟实现
6 strncat
6.1 用法
strncat
是 C 语言标准库中的一个函数,用于将指定长度的源字符串追加到目标字符串的末尾。与 strcat
函数类似,strncat
允许指定要追加的字符数,即使源字符串的长度超过指定的字符数。这可以避免缓冲区溢出的问题。
下面是 strncat
函数的原型:
#include <string.h> char *strncat(char *dest, const char *src, size_t n);
其中,dest
是目标字符串(要追加到的字符串),src
是源字符串(要被追加的字符串),n
是要追加的字符数。返回值是指向目标字符串 dest
的指针。
strncat
函数会将源字符串 src
的最多前 n
个字符追加到目标字符串 dest
的末尾,如果 src
的长度小于 n
,则只会追加 src
的全部内容;如果 src
的长度大于等于 n
,则只会追加 n
个字符。
#include <stdio.h>
#include <string.h>
int main() {
char dest[20] = "Hello, ";
char src[] = "World!";
strncat(dest, src, 5); // 只追加 src 的前 5 个字符
printf("Concatenated string: %s\n", dest);
return 0;
}
6.2 模拟实现
7. memmove
memmove
是 C 语言标准库中的一个函数,用于在内存块之间移动指定长度的数据。与 memcpy
类似,memmove
也可以用来复制一段内存区域的内容,但不同之处在于 memmove
能够处理源内存块和目标内存块有重叠的情况。
下面是 memmove
函数的原型:
#include <string.h> void *memmove(void *dest, const void *src, size_t n);
其中,dest
是目标内存块(要移动到的内存区域),src
是源内存块(要被移动的内存区域),n
是要移动的字节数。返回值是指向目标内存块 dest
的指针。
memmove
函数会将源内存块 src
中的内容移动到目标内存块 dest
中,即使这两个内存块有重叠部分也能正确执行。移动的字节数由参数 n
指定。
#include <stdio.h>
#include <string.h>
int main() {
char str[50] = "Hello, World!";
printf("Original string: %s\n", str);
// 将"World!"移动到"Hello, "
memmove(str, str + 7, 6);
printf("After memmove: %s\n", str);
return 0;
}
7.1 模拟实现
它的实现要考虑两种情况:
1> 因为是内存拷贝,所以一次拷贝多少比较合适
2> 在同一个数组或者字符进行拷贝的时候,覆盖的问题
当然还有几个函数是只要学会使用就可以的比如:
strncmp(str1, str2, n)
: 比较字符串str1
和str2
的前n
个字符是否相等。strchr(str, c)
: 在字符串str
中查找字符c
的第一次出现位置memset(ptr, value, num)
: 将指针ptr
指向的内存块的前num
个字节设置为值value
看你们有没有兴趣实现喽!
每日一问:你们知道怎么判断你的电脑是大端还是小端呢?