C语言----字符函数和字符串函数(2)https://developer.aliyun.com/article/1544414
7.strncpy函数的使用和模拟实现
int main() { char arr1[20] = "abcdef"; char arr2[20] = { 0 }; strncpy(arr2, arr1, 3); printf("%s", arr2);//打印的结果就是abc,只选择arr1里面的前三位字符进行拷贝 return 0; } int main() { char arr1[20] = "abcdef"; char arr2[20] = "xxxxxxxx"; strncpy(arr1, arr2, 3); printf("%s", arr1);//输出xxxdef return 0; }
拷贝n个字符从原字符串到目标空间
如果原字符串的长度小于n的话,则拷贝完原字符串之后,在目标的后边追加0,直到凑齐n个
strncpy函数的模拟实现
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <string.h> #include <assert.h> char* my_strncpy(char* des, const char* src, size_t num) { assert(des && src);//防止空指针 char* ps = des;//保留最初的位置 while (num--) { //防止指针越界 if (*src == '\0') { *des++ = '\0'; } else *des++ = *src++;//交换 } return ps; } int main() { char arr[] = "xxxxxxx"; char arr1[] = "abcdef"; my_strncpy(arr, arr1, 7);//仅仅只选择arr1的前7位进行拷贝 printf("%s\n", arr); return 0; }
8.strncat函数的使用和模拟实现
函数的使用
可以用来给自己追加
在原有的基础上,可以选择性的追加n个字符
函数的模拟实现
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <string.h> #include <assert.h> char* my_strncat(char* des, const char* src, size_t num) { assert(des && src); char* ps = des;//记录起始位置 //我们要找到arr'\0'的位置,再将arr1追加在arr后面 while (*des) { des++; } while (*des++ = *src++) ; *des = '\0'; return ps; } int main() { char arr[20] = "hello "; char arr1[] = "world"; my_strncat(arr, arr1, 7); printf("%s\n", arr); return 0; }
9.strncmp函数的使用和模拟实现
函数的使用
int main() { char arr1[20] = "abcdef"; char arr2[20] = "abc"; int ret=strncmp(arr1, arr2, 3);//比较三个字符 printf("%d", ret);//现在返回值就是0 return 0; }
指定几个字符进行比较久进行几个字符比较
总之来说还是比较方便的
模拟实现
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <string.h> #include <assert.h> char* my_strncpy(char* des, const char* src, size_t num) { assert(des && src);//防止空指针 char* ps = des;//保留最初的位置 while (num--) { //防止指针越界 if (*src == '\0') { *des++ = '\0'; } else *des++ = *src++;//交换 } return ps; } int main() { char arr[] = "xxxxxxx"; char arr1[] = "abcdef"; my_strncpy(arr, arr1, 7);//仅仅只选择arr1的前7位进行拷贝 printf("%s\n", arr); return 0; }
10.strstr的使用和模拟实现
在一个字符串里面找子字符串,在一个字符串里面找另外一个字符串是否出现
如果要找的字符串出现一次以上,那么我们就返回第一次出现的位置
在str1中找str2
如果在str1中没有找到str2的话,就会返回一个空指针NULL
int main() { char arr[] = "abcdefabcdef"; char* p = "efab";//定义了一个指向字符串常量"efab"的指针p char* ret=strstr(arr, p);//返回的是e的地址 //printf("%s", ret);//打印结果是efabcdef if (ret == NULL) { printf("不存在\n"); } else { printf("%s\n", ret); } return 0; }
char* my_strstr(const char* str1, const char* str2)//我们只是希望在str1中查找str2,并不希望将这两个字符串修改了,所以要加上const { assert(str1 && str2);//保证两个指针不是空指针 const char* s1 = NULL;//加上const限制住 const char* s2 = NULL; const char* cur = str1;//一开始指向的是str1的起始位置的 //*cur != '\0'简化如下:当*cur是\0我们就进不去循环了 if (*str2 == '\0')//特殊情况,假如str2是空指针,那么我们直接返回str1 { return str1; } while (*cur)//如果等于'\0'的话就说明这个字符串已经找完了 {//只要*cur不是\0就能一直寻找要找的字符串 //分别将起始位置赋值给s1和s2 s1 = cur; s2 = str2; //*s1!='\0'&& *s2!= '\0'简化如下,效果还是一样的 //就是反正你*s1和*s2是\0这个循环就进不去,直接跳出来了 while(*s1&& *s2&& * s1 == *s2)//判断两个指针指向位置的字符是否相等 { //如果这一对字符相等的情况下我们就往后走判断下一对字符 s1++; s2++; } if (*s2 == '\0')//说明我们已经在str1里面已经找完了字符串 { return cur;//那么我们就直接返回str1中我们记录的cur的位置 } cur++;//如果*s1!=*s2的话,就cur++换下一个字符,就跳出这个while循环了 //再次循环就s1又被重新赋值了,但是s2仍然是被srt2赋值, //就是相等与我们在仅仅只是将str1的出发点进行了更换,但是str2的还没变 //直到能在str1里面找到str2了,就是str2语言\0了,就说明已经在str1里面找到str2了 //如果*s1不为\0,但是*s2已经是\0了,那么这个while循环我们就跳出来了 } return NULL;//如果cur为\0就是我们已经不可能在str1中找到str2了,那我们直接返回空指针 } int main() { char arr[] = "abcdefabcdef"; char* p = "bbs"; const char* ret=my_strstr(arr, p); if (ret == NULL)//根据返回值进行判断str1中是否存在str2 { printf("不存在\n"); } else { printf("%s\n", ret); } return 0; } //如果在str1里面提前遇到了\0就说明这个字符串已经找完了还没遇到要找的字符串 //但是str2提前遇到\0的话,就说明我们已经找到了要找的字符串了 //总结: /* 我们在这个模拟函数中,我们最重要的就是创建了一个cur来不断重新定义来找的位置 假如在第一次寻找的过程中,我们没找到,那么cur就进行++操作,然后s1=str2重新赋值, 就是我们将要找的字符串的指针重新定义在首元素,但是cur一直在往后走, 直到s2走到\0,就是说明我们已经在str1内找到str2了 那么如果找到了的话,我们就将cur现在的地址return 回去,就是说明我们在str1中cur处可以找到str2了 */
我们当前写的strstr函数的实现不是最优的算法
KMP算法---字符串中找字符串---效率更高,但是实现更难
C语言----字符函数和字符串函数(4)https://developer.aliyun.com/article/1544420