字符串函数
1.strlen函数 求字符串长度的
//求字符串长度 int my_strlen(char* str) {int count = 0;while (*str != '\0'){count++;*str++;}return count; } int main() {char arr[] = "abcdef";int red = my_strlen(arr);printf("%d\n", red);return 0; }
2. strcpy 字符串拷贝
//求字符串拷贝 char* my_strcpy(char* arr2, char* arr1) {char *red = arr2;while (*arr2++ = *arr1++)//'\0'赋给arr2时arr2为假就停止循环{;}return red;} int main() {char arr1[] = { "abc" };char arr2[40] = { 0 };my_strcpy(arr2, arr1);printf("%s", arr2);return 0; }
3、strcat 字符串连接
先找到需要连接的字符串末端'\0'处,然后拷贝
拷贝是在\0这里进行拷贝。
//字符串连接 char* my_strcat(char* arr1, char* arr2) {char* ret=arr1;while (*arr1 != '\0'){arr1++;}while (*arr1++ = *arr2++){;}return ret; } int main() {char arr1[40] = { "hello" };char arr2[] = "bit";my_strcat(arr1, arr2);printf("%s", arr1);return 0; }
4.strcmp-字符串比较函数。
因为这个是二个不同的数组名,他们比较的肯定不一样,因为首元素地址不同,所以比较就不相同,这里比较的不是内容,是地址。
比较二个字符串应该用strcmp函数
//求字符串比较函数 int my_strcmp(char* arr1, char* arr2) {while (*arr1 == *arr2){if (*arr1 == '\0'){return 0;//相等arr1++;arr2++;}return (*arr1 - *arr2);} } int main() {char arr1[] = "abc";char arr2[]="bcd";int ret = my_strcmp(arr1, arr2);if (ret > 0){printf(">0\n");}else if (ret<0){printf("<0\n");}else{printf("==0\n");}return 0; }
这个代码关键就是*arr1和*arr2相同的情况下遇到'\0时应该终止循环,返回相等。
1.strncpy -字符串拷贝。
2.strncat(字符串连接)
加了n就是加了限定的条件,比如strncmp
3.strstr -----查找子串
如果找到了子串就返回第一个字符的地址,也就是b字符的地址,因为是从b字符开始才算找到子串。找不到返回空指针,NULL
//模拟实现一下strstr
char* my_strstr(char* arr1, char* arr2)
{char* s1 = arr1;char* s2 = arr2;char* p = arr1;while (*p){s1 = p;s2 = arr2;while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2){s1++;s2++;}if (*s2 =='\0'){return p;}p++;}return NULL;
}
int main()
{char arr1[] = "www.h";char arr2[] = "w.h";char* ret = my_strstr(arr1, arr2);if (ret == NULL){printf("子串不存在\n");}else{printf("%s\n", ret);}return 0;
}
strtok函数
//strcok()函数
#include <string.h>
int main()
{char arr1[] = "zhangsan@1666.com";char arr2[30] = { 0 };strcpy(arr2, arr1); const char* p = "@.";char* s2 = NULL;// 初始化只是初始话一次for (s2= strtok(arr2, p); s2 != NULL; s2=strtok(NULL, p)){printf("%s\n", s2);}return 0;
}
3. strerror?函数的使⽤?
strerror函数可以把参数部分错误码对应的错误信息的字符串地址返回来。?
在不同的系统和C语⾔标准库的实现中都规定了⼀些错误码,⼀般是放在 errno.h 这个头⽂件中说明
的,C语⾔程序启动的时候就会使⽤⼀个全⾯的变量errno来记录程序的当前错误码,只不过程序启动
的时候errno是0,表⽰没有错误,当我们在使⽤标准库中的函数的时候发⽣了某种错误,就会讲对应
的错误码,存放在errno中,⽽⼀个错误码的数字是整数很难理解是什么意思,所以每⼀个错误码都是
有对应的错误信息的。strerror函数就可以将错误对应的错误信息字符串的地址返回。?
#include <errno.h>
int main()
{for (int i = 0; i < 10; i++){printf("%s\n", strerror(i));}return 0;
}
4.memcpy -内存拷贝
模拟实现memcpy函数
void* my_memcpy(void* dest, void* src,size_t num)
{char* ret = dest;while (num--){*(char*)dest = *(char*)src;dest = (char*)dest + 1;src = (char*)src + 1;}return ret;}
int main()
{int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };my_memcpy(arr1 + 2, arr1, 20);for (int i = 0; i < 10; i++){printf("%d ", arr1[i]);}return 0;
}
//不能解决重叠问题
重叠问题
memmove使⽤和模拟实现
int main()
{int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };memmove(arr1 + 2, arr1, 20);for (int i = 0; i < 10; i++){printf("%d ", arr1[i]);}return 0;
}
//不能解决重叠问题
memset函数的使⽤
//memset内存设置
int main()
{char arr[] = "hello bite";memset(arr, 'x', 5);//以字节为单位来设置的printf("%s\n", arr);return 0;
}
memcmp函数的使⽤