通过代码实现str系列函数
strlen strcpy strcat strcmp
strncpy strncat strncmp
strstr strtok
1.strlen(字符串长度)
size_t myStrlen(const char* str) {
assert(str != NULL);
size_t size = 0;
while (str[size] != '\0') {
size++;
}
return size;
}
2.strcpy(字符串拷贝)
将src中的内容拷贝到dest里
char* myStrcpy(char* dest, const char* src) {
assert(dest != NULL);
assert(src != NULL);
int i = 0;
while (src[i] != '\0') {
dest[i] = src[i];
i++;
}
dest[i] = '\0';
return dest;
}
3.strcat(字符串拼接)
将src中的内容拼接到dest后面
char* myStrcat(char* dest, const char* src) {
assert(dest != NULL);
assert(src != NULL);
int destTail = 0;
while (dest[destTail] != '\0') {
destTail++;
}
//myStrcpy(dest + destTail, src);
int i = 0;
while (src[i] != '\0') {
dest[destTail + i] = src[i];
i++;
}
dest[destTail + i] = '\0';
return dest;
}
4.strcmp(比较字符串大小关系/是否相等)
strcmp(a,b)
a<b => <0的整数
a>b => >0的整数
a=b => 0
int myStrcmp(const char* str1, const char* str2) {
assert(str1 != NULL);
assert(str2 != NULL);
const char* p1 = str1;
const char* p2 = str2;
while (*p1 != '\0' && *p2 != '\0') {
if (*p1 < *p2) {
return -1;
}
else if (*p1 > *p2) {
return 1;
}
else {
p1++;
p2++;
}
}
/*if (*p1 < *p2) {
return -1;
}
else if(*p1>*p2){
return 1;
}
else {
return 0;
}*/
return *p1 - *p2;
}
5.strncpy
将src所指向的字符串以src地址开始的
前num个字节拷贝到dest中去
char* myStrncpy(char* dest, char* src, size_t num) {
assert(dest != NULL);
assert(src != NULL);
assert(num != 0);
size_t i = 0;
while (src[i] != '\0'&&i<num) {
dest[i] = src[i];
i++;
}
while (i < num) {
dest[i] = '\0';
i++;
}
return dest;
}
6.strncat
将src的前num个字节追加到dest后,会补\0
char* myStrncat(char* dest, const char* src, size_t num) {
assert(dest != NULL);
assert(src != NULL);
assert(num != 0);
size_t destTail = 0;
while (dest[destTail] != '\0') {
destTail++;
}
size_t i = 0;
while (src[i] != '\0' && i < num) {
dest[destTail + i] = src[i];
i++;
}
dest[destTail + i] = '\0';
return dest;
}
7.strncmp
比较str1和str2的前num个字节
int myStrncmp(const char* str1, const char* str2, size_t num) {
assert(str1 != NULL);
assert(str2 != NULL);
assert(num != 0);
size_t i = 0;
while (str1[i] != '\0' && str2[i] != '\0' && i < num) {
if (str1[i] < str2[i]) {
return -1;
}
else if (str1[i] > str2[i]) {
return 1;
}
else {
i++;
}
}
if (i == num) {
return 0;
}
return str1[i] - str2[i];
}
8.strstr
判定一个字符串是否包含另一个
const char* myStrstr(const char* str1, const char* str2) {
assert(str1 != NULL);
assert(str2 != NULL);
assert(*str1 != '\0');
assert(*str2 != '\0');
const char* black = str1;
while (*black != '\0') {
const char* red = black;
const char* sub = str2;
while (*red!='\0'&&*sub!='\0'
&&*red == *sub) {
red++;
sub++;
}
//以上循环结束,有3种可能
//1.*red==\0 直接结束循环 进入下次
//2.*sub==\0 找到了 返回black
//3.*red!=*sub 直接进入下次循环
/*if (*red == '\0' || *red == *sub) {
black++;
continue;
}*/
if (*sub == '\0') {
return black;
}
black++;
}
return NULL;
}
9.strtok(字符串切分)
int main() {
char str[] = "aaaa bbbb cccc dddd";
char* pch = strtok(str, " ");
while (pch != null) {
printf("%s\n", pch);
pch = strtok(null, " ");
}
return 0;
}