C语言----字符函数和字符串函数(1)https://developer.aliyun.com/article/1544411
4.strcpy的使用和模拟实现
功能:拷贝字符串
strcpy---cpoy string
strcpy在拷贝的过程中会将arr1里面的内容包括\0拷贝到arr2里面去
int main() { char arr1[] = "hello world"; char arr2[20] = { 0 }; //现在想把arr1里面的hello world放到arr2里面去 //我们可以用strcpy来实现 strcpy(arr2, arr1); printf("%s\n", arr2); return 0; }
注意注意:
被拷贝的字符串一定要包含'\0',保证strcpy遇到\0就能停止拷贝
1.源头的字符串中必须包含\0,没有\0,strcpy是不能结束的
2.目标空间必须足够大,以确保能存放原字符串
3.目标空间必须是可以修改的
int main() { char arr1[] = "hello world"; char* p = "xxxxxxxxxxxxxx";//常量字符串--不能修改 strcpy(p, arr1);//会报错的 return 0; }
//模拟实现拷贝 char*my_strcpy(char*dest,const char*src)//传过来的是首元素的地址,返回值是目标空间的起始地址,所以就是char* { //*dest指向的是arr2第 // 一个元素,*src指向的是arr1第一个元素 //保证这两个指针不为空指针 /*assert(src != NULL); assert(dest != NULL);*/ //另一种写法: assert(dest && src);//如果dest为空指针,那么括号内就为0,就是假的,就会报错 char* ret = dest;//将dest存起来 while (*src != '\0') { *dest=*src; //进行加加操作,换下一个字符和下一个位置进行交换 src++; dest++; }//当这个循环结束的时候,\0还没有被拷贝进去 //最后的时候,src已经++成为\0了,那么现在再次赋值就能将\0拷贝进去了 *dest =* src;//这里处理的就是\0 return ret;//直接返回目标空间的起始地址 } int main() { char arr1[] = "abcdef";//末尾隐藏\0 char arr2[20] = { 0 }; //1.直接打印arr2 my_strcpy(arr2, arr1); printf("%s\n", arr2); //2.接收返回值 char* p = my_strcpy(arr2, arr1); printf("%s\n", p); //直接将返回值放到打印里面也可以 printf("%s\n", my_strcpy(arr2, arr1)); return 0; } //这个函数返回的是char*,为的是实现链式访问 //strcpy函数返回的是字符串拷贝成功过后,目标空间的起始地址, //返回值就是arr2的首元素的地址 //总结: //将arr1拷贝到arr2后,我们可以通过三种方法直接打印arr2 //一种就是直接打印arr2 //还有一种就是根据这个拷贝函数的返回值进行打印 //返回值是一个地址,在函数的一开始我们就将目标函数赋值给另一个临时指针,那么这个临时指针就指向了arr2 //在拷贝过后,我们直接将这个临时指针返回,所以在函数的开头我们用char* //在返回了临时指针后,我们在主函数就用再创建一个临时指针变量进行返回值的接受, //因为这个临时指针变量指向的是arr2的其实元素,那么我们就可以用这个临时指针变量直接打印arr2 //有了字符串起始元素的地址,我们就能打印这个字符串了
//对函数部分进行改进, //思考:能不能将拷贝\0和前面的字符串放在一起呢? char*my_strcpy(char*dest,const char*src) { assert(dest && src); char* ret = dest; while (*dest++ = *src++)//因为这里是后置++,所以先带进去数据进行解引用,再进行++ { //arr1里面的字符通过*dest++ = *src++这个代码一个个拷贝到arr2里面去了 //在最后,*src是\0拷贝过去了,然后因为while循环里面是\0,所以循环停止了 // 但是\0拷贝到dest里面了 ; }//这个循环拷贝过去之后判断表达式的值 //因为是后置++,所以延后产生 return ret; } int main() { char arr1[] = "abcdef"; char arr2[20] = { 0 }; my_strcpy(arr2, arr1); printf("%s\n", arr2); char* p = my_strcpy(arr2, arr1); printf("%s\n", p); printf("%s\n", my_strcpy(arr2, arr1)); return 0; }
5.strcat的使用和模拟实现
原字符串必须有\0结尾
目标字符串也得有\0,否则没办法知道从哪里开始
目标空间必须足够大,能容纳下字符串的内容
目标空间是可以进行修改的,而不是常量不能进行修改
int main() { char arr1[20] = "hello "; char arr2[] = "world"; //如何将arr2里面的字符串追加在arr1后面呢? strcat(arr1, arr2);//字符串追加 printf("%s\n", arr1); return 0; } //这个函数是如何实现追加呢? //先找到目标函数的末尾\0的位置 //再将原字符串拷贝过来 //要求目标字符串末尾有\0,因为后面要将原字符串拷贝过去,所以原字符串也要有\0
//要返回目标空间的起始地址 //目标空间是可修改的,但是源头需要进行限制,不能被修改 char* my_strcat(char* dest,const char* src)//返回类型为char*类型的 //dest指向的是arr1的首元素的地址 //src指向的是arr2首元素的地址 { char* ret = dest;//将起始位置存起来 assert(dest && src);//进行断言,防止空指针 //1.找目标空间的\0 while (*dest != '\0') { dest++; }//while循环找到\0就停下来 //2.拷贝----我们在字符串追加的时候,我们要将目标字符串末尾的\0覆盖掉 while (*dest++ = *src++)//这个代码是进行字符串间的拷贝的,因为上面已经找到\0了,已经停止循环了,并且dest指向了arr1末尾的\0 { ;//写个分号就行了,循环得有一个循环语句 } return ret;//直接返回arr1的起始地址 } int main() { char arr1[20] = "hello "; char arr2[] = "world"; //如何将arr2里面的字符串追加在arr1后面呢? my_strcat(arr1, arr2);//字符串追加 printf("%s\n", arr1); return 0; } //这个函数是如何实现追加呢? //先找到目标函数的末尾\0的位置 //再将原字符串拷贝过来 //要求目标字符串末尾有\0,因为后面要将原字符串拷贝过去,所以原字符串也要有\0 //总结: 我们应该先找到目标字符串末尾\0的位置,这样我们才好追加, //切记:追加的时候我们要将目标字符串末尾的\0覆盖掉 //在这个追加函数我们用了两个循环,第一个循环是找到\0,第二个循环是将原字符串拷贝到目标字符串的后面去
我们是不能对一个数组自己进行追加的
6.strcmp的使用和模拟实现
strcmp是用来比较两个字符串的
返回值是int
用返回值来比较这两个字符串大小
比较的是对应位置上的字符,如果对应位置字符相等就比较下一对字符
比较的不是字符串的长度,而是对应位置上字符的大小
如果两个字符串相等,返回值就是0
如果前面的字符串大于后面的字符串,那么就会返回一个大于0的数字
如果是后面的字符串大于前面的字符,前面的字符小,就返回一个小于 0的数字
int main() { char arr1[] = "abcdef"; char arr2[] = "abq"; int ret=strcmp(arr1, arr2); //printf("%d\n", ret);//输出的结果是-1,就说明arr1<arr2 if (ret == 1)//仅仅在vs平台可以写返回值为1,其他的平台就不知道返回值是多少了 { printf(">" ); } else { printf("<="); } return 0; }
// //int main() //{ // char arr1[] = "abcdef"; // char arr2[] = "abq"; // int ret=strcmp(arr1, arr2); // //printf("%d\n", ret);//输出的结果是-1,就说明arr1<arr2 // if (ret == 1)//仅仅在vs平台可以写返回值为1,其他的平台就不知道返回值是多少了 // { // printf(">" ); // } // else // { // printf("<="); // } // return 0; //} //int my_strcmp(const char*str1,const char*str2)//返回值是Int,并且加上const进行限制 //{ // //我们一对一对字符进行比较 // assert(str1 && str2); // while (*str1 == *str2) // { // if (*str1 == '\0')//如果str1在上一轮循环++到\0之后,就说明这两个字符串已经完全相等了 // { // return 0;//两个字符串完全相等 // } // str1++; // str2++; // }//两个字符相等我们就找下一对字符进行比较 // if (*str1 > *str2) // { // return 1; // } // else//*str1 < *str2 // { // return -1; // } //} //另一种写法 int my_strcmp(const char* str1, const char* str2)//返回值是Int,并且加上const进行限制 { //我们一对一对字符进行比较 assert(str1 && str2); while (*str1 == *str2) { if (*str1 == '\0')//如果str1在上一轮循环++到\0之后,就说明这两个字符串已经完全相等了 { return 0;//两个字符串完全相等 } str1++; str2++; }//两个字符相等我们就找下一对字符进行比较 return (*str1 - *str2);//直接返回他们相减的值 } int main() { char arr1[] = "abcdef"; char arr2[] = "abcdef"; int ret=my_strcmp(arr1, arr2); printf("%d\n", ret); return 0; }
C语言----字符函数和字符串函数(3)https://developer.aliyun.com/article/1544419