1. 概述
C中字符串操作函数包括
- size_t strlen(const char *str) 获取字符串str的长度
- char *strcpy(char *dest, char *src) 字符串src复制到字符串dest
- char *strncpy(char *dest, char *src, size_t n) 字符串src的前n个字符复制到字符串dest
- char *strcat(char *dest, char *src) 字符串src拼接到字符串dest后面
- char *strncat(char *dest, char *src, size_t n) 字符串src的前n个字符拼接到字符串dest后面
- char *strchr(char *str, const int c) 在字符串str中从左侧开始查找字符c,找到则返回以c开始的后续字符串 找不到则返回null
- char *strrchr(char *str, const int c) 在字符串str中从右侧开始查找字符c,找到则返回以c开始的后续字符串 找不到则返回null
- char *strstr(char *str, const char *substr) 在字符串str中查找子串substr,找到则返回以子串substr开始的后续字符串 找不到则返回null
- int strcmp(const char *str1, const char *str2) 对比两个字符串的大小
- int strncmp(const char *str1, const char *str2, size_t n) 对比两个字符串前n个字符的大小
2. 实现
2.1 创建my_string.h
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 实现strlen()
size_t strlen_my(const char *str);
// 实现strcpy()
char *strcpy_my(char *dest, char *src);
// 实现strncpy()
char *strncpy_my(char *dest, char *src, size_t n);
// 实现strcat()
char *strcat_my(char *dest, char *src);
// 实现strncat()
char *strncat_my(char *dest, char *src, size_t n);
// 实现strchr()
char *strchr_my(char *str, const int c);
// 实现strrchr()
char *strrchr_my(char *str, const int c);
// 实现strstr()
char *strstr_my(char *str, const char *substr);
// 实现strcmp()
int strcmp_my(const char *str1, const char *str2);
// 实现strncmp()
int strncmp_my(const char *str1, const char *str2, const size_t n);
2.2 创建my_string.c
#include "book81.h"
// 实现strlen()
size_t strlen_my(const char *str) {
int i = 0;
while (str[i] != '\0') {
i++;
}
return i;
}
// 实现strcpy()
char *strcpy_my(char *dest, char *src) {
int i = 0;
while (src[i] != '\0') {
dest[i] = src[i];
i++;
}
dest[i] = '\0';
return dest;
}
// 实现strncpy
char *strncpy_my(char *dest, char *src, size_t n) {
// 防止copy越界
int len = (strlen_my(src) > n) ? n : strlen_my(src);
int i = 0;
while (i < len) {
dest[i] = src[i];
i++;
}
dest[i] = '\0';
return dest;
}
// 实现strcat()
char *strcat_my(char *dest, char *src) {
int dest_len = strlen_my(dest);
int i;
for (i = 0; i < strlen_my(src); i++) {
dest[dest_len + i] = src[i];
}
dest[dest_len + i] = '\0';
return dest;
}
// 实现strncat()
char *strncat_my(char *dest, char *src, size_t n) {
int dest_len = strlen_my(dest);
int len = (strlen_my(src) > n) ? n : strlen_my(src);
int i;
for (i = 0; i < len; i++) {
dest[dest_len + i] = src[i];
}
dest[dest_len + i] = '\0';
return dest;
}
// 实现strchr() 返回在字符串 str 中第一次出现字符 c 的位置
char *strchr_my(char *str, const int c) {
int i = 0;
while (str[i] != '\0') {
if (str[i] == c)
return (char *)str + i;
i++;
}
return 0;
}
// 实现strrchr()
char *strrchr_my(char *str, const int c) {
int i = strlen_my(str) - 1;
for (; i >= 0; i--) { // 此处不能使用size_t unsigned int 不能与0比较
if (str[i] == c)
return (char *)str + i;
}
return 0;
}
// 实现strstr()
char *strstr_my(char *str, const char *substr)
{
char *pos = (char *)str;
char *cur_pos;
int flag;
while (pos[0] != '\0') {
cur_pos = strchr_my(pos, substr[0]);
if (!cur_pos)
return 0;
if (strncmp_my(cur_pos, substr, strlen_my(substr)) == 0)
return (char *)cur_pos;
pos++;
}
return 0;
}
// 实现strcmp()
int strcmp_my(const char *str1, const char *str2) {
int len = (strlen_my(str1) > strlen_my(str2)) ? strlen_my(str2) : strlen_my(str1);
int i = 0;
for (; i < len; i++) {
if (str1[i] == str2[i])
continue;
else
break;
}
if ((i == len) && (strlen_my(str1) == strlen_my(str2)))
return 0;
if (str1[i] > str2[i])
return 1;
else
return -1;
}
// 实现strncmp()
int strncmp_my(const char *str1, const char *str2, const size_t n) {
int i = 0;
for (; i < n; i++) {
if (str1[i] == str2[i])
continue;
else
break;
}
if (i == n)
return 0;
if (str1[i] > str2[i])
return 1;
else
return -1;
}
3. 测试
int main() {
char str1[] = "hahahaha";
printf("strlen_my: *%d*\n", strlen_my(str1));
char str2[10];
strcpy_my(str2, str1);
printf("strcpy_my: *%s*\n", str2);
char str3[10];
strncpy_my(str3, str1, 20);
printf("strncpy_my: *%s*\n", str3);
char str4[20] = "heihei";
strcat_my(str4, str1);
printf("strcat_my: *%s*\n", str4);
char str5[20] = "heihei";
strncat_my(str5, str1, 20);
printf("strncat_my: *%s*\n", str5);
printf("strchr_my: *%s*\n", strchr_my(str1, 'e'));
printf("strrchr_my: *%s*\n", strrchr_my(str1, 'c'));
char str6[20] = "hahaha";
printf("strcmp_my: *%d*\n", strcmp_my(str6, str1));
char str7[20] = "hahahaha";
printf("strncmp_my: *%d*\n", strncmp_my(str7, str1, 2));
char str8[20] = "csdcsdhehahcsdcsde";
char str9[] = "ha";
printf("strstr_my: *%s*\n", strstr_my(str8, str9));
return 0;
}