字符串函数
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函数的使⽤