-
strlen(const char*str)求字符串长度的函数,找'\0'前面的字符个数,形参是const char*str ,注意库函数返回类型是unsigned int,不可能是负数
下面三种方式模拟实现strlen
//int my_strlen1(char* arr) //{ // int count = 0; // while (*arr != '\0') // { // arr++; // count++; // } // return count; //}int my_strlen2(char* arr) //{ // if (*arr != '\0') // { // return my_strlen2(arr + 1) + 1; // } // else // return 0; //}int my_strlen3(char* arr) //{ // char*t = arr; // while (*arr != '\0') // { // arr++; // } // return arr - t; //} //int main() //{ // char arr[] = "abcdef"; // printf("%d\n",my_strlen1(arr)); // printf("%d\n",my_strlen2(arr)); // printf("%d\n",my_strlen3(arr)); // return 0; //}
1是只要没看到\0就计数加加,2是函数递归思想,遇到\0返回零,其他返回下一个原函数加1,第三种是运了指针,两个指针相减就是中间元素的个数
2.strcpy(char*dest,const char*src)表示把第二个字符串中的元素拷贝到第一个字符串中,库函数返回类型是char*第一个字符串首元素地址
里面注意第一个字符串不能用char*arr=”abcdef“,这是常量字符串
/void my_strcpy(char* dest, const char* src)//const修饰源头字符串表示里面字符串是常量 //{ // while (*src != '\0') // { // *dest = *src; // src++; // dest++; // } // *dest = *src; //} //char* my_strcpy1(char* dest, const char* src) //{ // char* ret = dest;//把要被拷贝字符串的首地址存起来,地址里面的值是可以改变的 // while (*dest++ = *src++);//这是后置++,先解引用在++,把src元素从第一个赋给dest,直到赋给'\0'时,表达式里面正好是0=0停下 // return ret; //} //int main() //{ // char arr1[] = "abcdefgh"; // char arr2[] = "zyxdsg"; // my_strcpy(arr1, arr2); // printf("%s\n", arr1); // printf("%s\n", my_strcpy1(arr1, arr2)); //}
这是一种方法,吧源头数组地址的值给了目的地的地址,一直加一直交换,直到遇到\0停下,还短一个\0在赋给,第二中是第一种的简化升级,有注释可以理解。
3.strcat(arr1,arr2)追加字符串,把源头追加到目的地中,目的地的空间要足够大,两个字符串中都要有'\0'
char * strcat ( char * destination, const char * source );标准
char* my_strcat(char* dest, const char* src) //{ // assert(dest != NULL); // assert(src != NULL); // char* ret = dest;//把首元素地址存起来 // while (*dest != '\0')//找到dest字符串\0的地址 // { // dest++; // } // while (*dest++ = *src++);//直到加到'\0'停下 // return ret; //} //int main() //{ // char arr1[40] = "hello"; // char arr2[] = "world"; // printf("%s\n", my_strcat(arr1, arr2)); // printf("%s\n", arr1); // return 0; //}
4.strcmp int strcmp ( const char * str1, const char * str2 );
比较两个字符串,(比较奥斯卡码值)如果字符串1小于字符串2返回小于0的数字,等于返回0,大于返回大于0的数字
int my_strcmp(const char* str1, const char* str2) //{ // assert(str1 && str2);//断言两个字符串不能为空指针 // while (*str1 != '\0')//当第一个字符串没有结束时 // { // if (*str1 == *str2) // { // str1++; // str2++; // } // else // return (*str1) - (*str2);//当里面的值相同时,返回一个整数 // } // if (*str1 == *str2)//当最后一个'\0'也相同时就是相同,返回0 // { // return 0; // } // else //当str1最后一个是‘\0’而str2不是,说明str1《str2 // return -1; //} //int main() //{ // char arr1[] = "abcdefg"; // char arr2[] = "abcdefghi; // int ret = my_strcmp(arr1, arr2); // if(ret>0) // { // printf("arr1>arr2\n"); // } // else if(ret==0) // { // printf("arr1=arr2\n"); // } // else // { // printf("arr1<arr2\n"); // } // return 0;
2,3,4都是长度不受限制都是要看到'\0'都要看结束标志