目录
2.strcpy,strcat,strcmp 长度不受限制的字符串函数
3.strncpy,strncat,strncmp 长度受限制的字符串函数
一. 字符串函数
1. strlen 求字符串长度函数
首先,以下是cplus plus官网对strlen函数的解释,传入的是字符类型的指针,返回的是size_t类型的数据,计算的是'\0'之前出现的字符的个数,包含在头文件string.h中。
以下是其用法:
#include <stdio.h>
#include <string.h>
int main()
{
char str[] = "hello world";
int len = strlen(str);
printf("%d\n", len);
return 0;
}
模拟实现(三种方式):
//方法一:计数器
int my_strlen(char* ch)
{
int count = 0;
while (*ch)
{
count++;
ch++;
}
return count;
}
//方法二:指针减指针
int my_strlen1(char* ch)
{
char* end = ch;
while (*end)
{
end++;
}
return end - ch;
}
//方法三:递归
int my_strlen2(char* ch)
{
int count = 0;
if (*ch == '\0')
{
return 0;
}
else
{
ch++;
return 1 + my_strlen2(ch);
}
}
int main()
{
char ch[] = { 'a','b','v','d','e','\0' };
int len = my_strlen(ch);
int len1 = my_strlen1(ch);
int len2 = my_strlen1(ch);
printf("%d\n", len);
printf("%d\n", len1);
printf("%d\n", len2);
return 0;
}
2.strcpy,strcat,strcmp 长度不受限制的字符串函数
对于strcpy函数,以下是cplus plus官网对strcpy函数的解释,传入两个类型的数组,将后面的的数组copy到前一个数组,并返回传入数组的首元素地址。
以下是对strcpy的模拟实现:
char* my_strcpy(char* dest, const char* source)
{
assert(dest && source);
char* ret = dest;
while (*dest++ = *source++)
{
;
}
return ret;
}
int main()
{
char str1[20] = { 0 };
char str2[] = "hello,bit";
printf("%s\n", my_strcpy(str1, str2));
return 0;
}
对于strcat函数,以下是cplus plus官网对strcat函数的解释,这是字符串链接函数,传入两个数组,并返回一个字符类型的指针。
以下是模拟实现:
//strcat() 模拟实现
char* my_strcat(char* str1, char* str2)
{
assert(str1 && str2);
char* ret = str1;
while (*str1 != '\0')
{
str1++;
}
while (*str1++ = *str2++)
{
;
}
return ret;
}
int main()
{
char str1[20] = "hello ";
char str2[] = "bit";
printf("%s\n", my_strcat(str1, str2));
return 0;
}
对于strcmp函数,以下是cplus plus官网对strcmp函数的解释,这是字符串比较函数,比较的是字符的ASCII码值,如果str1指向的字符大于str2指向的字符,则返回一个大于0的数字,小于则返回小于0的数字,相等则返回0。
以下是对它的模拟实现:
//strcpy() 模拟实现
int my_strcmp(const char* str, const char* str1)
{
assert(str && str1);
while (*str == *str1)
{
if (!*str)
{
return 0;
}
str++;
str1++;
}
return *str - *str1;
}
int main()
{
char str[] = { "hello, world" };
char str1[] = { "hello, world!" };
if (my_strcmp(str, str1) > 0)
{
printf(">\n");
}
else
{
printf("<=\n");
}
return 0;
}
3.strncpy,strncat,strncmp 长度受限制的字符串函数
对于strncpy函数,以下是cplus plus官网对strncpy函数的解释,相较于strcpy只是多了一个size_t的传入类型。
模拟实现:
#include <stdio.h>
char* my_strncpy(char* dest, const char* src, size_t n) {
char* result = dest;
size_t i;
for (i = 0; i < n && src[i] != '\0'; i++) {
dest[i] = src[i];
}
for (; i < n; i++) {
dest[i] = '\0';
}
return result;
}
int main() {
char src[] = "Hello, world!";
char dest[15];
my_strncpy(dest, src, sizeof(dest));
printf("Copied string: %s\n", dest);
return 0;
}
对于strncat函数,以下是cplus plus官网对strncat函数的解释,用于将一个字符串的一部分或全部内容追加到另一个字符串的末尾。
模拟实现:
char* strncat(char* dest, const char* src, size_t n) {
char* result = dest;
// 找到目标字符串的末尾
while (*dest != '\0') {
dest++;
}
// 追加源字符串的内容到目标字符串的末尾,最多追加n个字符
while (*src != '\0' && n > 0) {
*dest = *src;
dest++;
src++;
n--;
}
// 加上字符串结束符
*dest = '\0';
return result;
}
int main() {
char dest[20] = "Hello, ";
char src[] = "world!";
strncat(dest, src, sizeof(dest) - strlen(dest) - 1);
printf("Concatenated string: %s\n", dest);
return 0;
}
对于strncmp函数,以下是cplus plus官网对strncmp函数的解释,用于比较两个字符串的前n个字符是否相等。
int strncmp(const char* str1, const char* str2, size_t n) {
while (n > 0) {
if (*str1 != *str2) {
return (*str1 - *str2);
}
if (*str1 == '\0') {
return 0; // 达到字符串末尾,相等
}
str1++;
str2++;
n--;
}
return 0; // 比较完n个字符,相等
}
int main() {
char str1[] = "Hello";
char str2[] = "Hell";
int result = strncmp(str1, str2, 4);
if (result == 0) {
printf("Strings are equal.\n");
}
else if (result < 0) {
printf("String 1 is less than string 2.\n");
}
else {
printf("String 1 is greater than string 2.\n");
}
return 0;
}
4.strstr,strtok 字符串查找
strstr函数,以下是在cplusplus官网对其的解释,用于在一个字符串中查找另一个字符串的第一次出现位置。
#include <assert.h>
char* my_strstr(const char* str1,const char* str2)
{
assert(str1 && str2);
char* cp = str1;
char* s1 = NULL;
char* s2 = NULL;
if (*str2 == '\0')
{
return str1;
}
while (*cp)
{
s1 = cp;
s2 = str2;
while (*s1 != '\0' && *s2 != '\0' && (*s1 == *s2))
{
s1++;
s2++;
}
if (*s2 == '\0')
{
return cp;
}
cp++;
}
return NULL;
}
int main()
{
char* str1 = "abcdddefg";
char* str2 = "ddd";
printf("%s",my_strstr(str1, str2));
return 0;
}
strtok函数,以下是在cplusplus官网对其的解释,用于将一个字符串按照指定的分隔符进行分割。
以下是其的基本用法:
int main() {
char str[] = "Hello, world! How are you?";
char delim[] = " ,!?"; // 分隔符可以是空格、逗号、问号和感叹号
char* token;
// 使用strtok分割字符串
token = strtok(str, delim);
while (token != NULL) {
printf("%s\n", token);
token = strtok(NULL, delim);
}
return 0;
}
5.strerror 错误信息报告
strerror函数,以下是在cplusplus官网对其的解释,用于将错误码转换为对应的错误信息字符串。
以下是其基本用法
#include <errno.h>
int main() {
int errnum = 2; // 假设发生了一个错误,错误码为2
const char* errmsg = strerror(errnum);
printf("Error message: %s\n", errmsg);
return 0;
}
二. 内存操作函数
1.memcpy
memcpy函数是C语言标准库中的一个内存拷贝函数,用于将一段内存的内容复制到另一段内存。以下是cplusplus对其的解释。
基本用法:
#include <stdio.h>
#include <string.h>
int main() {
char src[] = "Hello, world!";
char dest[20];
memcpy(dest, src, strlen(src) + 1);
printf("Copied string: %s\n", dest);
return 0;
}
模拟实现:
void* my_memcpy(void* dest, const void* src, size_t num)
{
assert(dest && src);
void* ret = dest;
while (num--)
{
*((char*)dest) = *((char*)src);
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;
}
int main()
{
int arr1[20] = { 0 };
int arr2[] = { 1,2,3,4,5,6 };
my_memcpy(arr1, arr2, 24);
int i = 0;
for (i = 0; i < 20; i++)
{
printf("%d ", arr1[i]);
}
return 0;
}
2. memmove
memmove
函数是C语言标准库中的一个内存拷贝函数,用于在内存中移动一段数据。与memcpy
函数不同的是,memmove
函数可以正确处理源和目标内存区域的重叠。以下是cplusplus对其的解释。
基本用法:
int main() {
char str[] = "Hello, world!";
memmove(str + 7, str, strlen(str) + 1);
printf("Moved string: %s\n", str);
return 0;
}
模拟实现:
void* my_memmove(void* dest, const void* src, size_t num)
{
assert(dest, src);
void* ret = dest;
if (dest < src)
{
while (num--)
{
*((char*)dest) = *((char*)src);
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else
{
while (num--)
{
*((char*)dest + num) = *((char*)src + num);
}
}
return ret;
}
int main()
{
int arr1[] = { 1,2,3,4,5,6,7,8,9,0 };
my_memmove(arr1, arr1 + 2, 20);
int i = 0;
for (i = 0; i < 10; i++)
{
printf("%d ", arr1[i]);
}
printf("\n");
return 0;
}
以下是对模拟实现的图解:
3.memset
memset
函数是C语言标准库中的一个内存设置函数,用于将一段内存区域的内容设置为指定的值。以下是cplusplus对其的解释。
基本用法:
int main() {
char str[20];
// 使用memset将str中的内容设置为字符'A'
memset(str, 'A', sizeof(str));
printf("Filled string: %s\n", str);
return 0;
}
4.memcmp
memcmp
函数是C语言标准库中的一个内存比较函数,用于比较两段内存区域的内容是否相等。以下是cplusplus对其的解释。
基本用法:
#include <stdio.h>
#include <string.h>
int main() {
char str1[] = "Hello";
char str2[] = "World";
int result = memcmp(str1, str2, sizeof(str1));
if (result == 0) {
printf("The strings are equal.\n");
} else if (result < 0) {
printf("str1 is less than str2.\n");
} else {
printf("str1 is greater than str2.\n");
}
return 0;
}
以上就是我对字符串函数和内存函数的理解。