strlen:
strlen:
int my_strlen(const char* str)
{
assert(str != NULL);
int count = 0;//计数器
while (*str != '\0')
{
count++;
str++;
}
return count;
}
int main()
{
char arr[] = "abc";
//char arr[] = { 'a','b','c'}; 没\0 err
int len = my_strlen(arr);
printf("%d\n", len);
return 0;
}
strcpy:char * strcpy(char * destination,const char * source)
int main()
{
char arr[20] = { 0 };
//arr = "hello" err
strcpy(arr, "hello"); //string copy
//会把'\0'拷贝过去,并且\0是strcpy终止条件
//目标空间要足够大,并且可变,
char arr2[] = { 'a','b','c' };
strcpy(arr, arr2); //err
printf("%s\n", arr);
return 0;
}
strcat:char * strcat(char * destination,const char * source)
char* my_strcat(char* dest, const char* src)
{
char* ret = dest;
assert(dest && src);
//1.找到目标字符串中的\0
while (*dest)
{
dest++;
}
//2.源数据追加过去,包含\0
while (*dest++ = *src++)
{
;
}
return ret;//返回目标空间的起始地址
}
int main()
{
char arr1[20] = "hello ";
char arr2[] = "world";
//strcat(arr1, arr2);//字符串追加,不能自己给自己追加
//my_strcat(arr1, arr2);
printf("%s\n", my_strcat(arr1,arr2));
return 0;
}
strcmp:int strcmp(const char* str1, const char* str2)
int main()
{
char* p = "abc";
char* q = "abcdef";
//错误的方法:
//if (p > q) or ("abc" > "abcdef")
//{
// printf(">\n");
//}
//else
//{
// printf("<\n");
//}
//strcmp - 字符串比较大小的
int ret = strcmp("abc", "abcdef");
printf("%d\n", ret);
//return < 0 :ptr1<ptr2 , =0: prt1=ptr2 , >0:prt1>prt2
return 0;
}
模拟实现strcmp:
int my_strcmp(const char* s1, const char* s2)
{
assert(s1 && s2);
while (*s1 == *s2)
{
if (*s1 == '\0')
{
return 0;
}
s1++;
s2++;
}
return *s1 - *s2;
//太麻烦了
//if (*s1 > *s2)
//{
// return 1;
//}
//else
//{
// return -1;
//}
}
int main()
{
char* p = "abcdef";
char* q = "abbb";
int ret = my_strcmp(p, q);
if (ret > 0)
{
printf("p > q\n");
}
else if (ret < 0)
{
printf("q < p\n");
}
else
{
printf("p = q\n");
}
return 0;
}
strcpy, strcat, strcmp -- 长度不受限制的字符串函数
strncpy strncat strncmp -- 长度受限制的字符串函数
strncpy:char* strncpy(char* destination, const char* source, size_t num)
int main()
{
char arr1[20] = "abcdef";
char arr2[] = "qwer";
strncpy(arr1, arr2, 2);
printf("%s\n", arr1);//qwcdef
return 0;
}
strncat:
int main()
{
char arr1[20] = "hello ";
char arr2[] = "world";
strncat(arr1, arr2, 3);
printf("%s\n", arr1);
return 0;
}
strncmp:
int main()
{
char* p = "abcdef";
char* q = "abcqwert";
int ret1 = strcmp(p, q);
int ret2 = strncmp(p, q, 3);
printf("%d %d\n", ret1, ret2);
return 0;
}
strstr:char* strstr(const char* , const char*)
char* my_strstr(const char* str1, const char* str2)
{
assert(str1 && str2);
const char* s1 = NULL;
const char* s2 = NULL;
const char* cp = str1;
if (*str2 == '\0')
{
return (char*)str1;
}
while (*cp)
{
s1 = cp;
s2 = str2;
while (*s1 && *s2 && (*s1 == *s2))
{
s1++;
s2++;
}
if (*s2 == '\0')
{
return cp;
}
cp++;
}
return NULL;
}
int main()
{
char arr1[] = "abcefabcdef";
char arr2[] = "bcd";
//在arr1中查找是否包含arr2数组
//char* ret = strstr(arr1,arr2);//找到返回第一次出现的位置,不存在返回NULL
char* ret = my_strstr(arr1, arr2);
if (ret == NULL)
{
printf("没找到\n");
}
else
{
printf("找到了:%s\n",ret);
}
return 0;
}
strtok:char * strtok(char*str,const char * sep) - 切割字符串
sep参数是个字符串,定义了用作分隔符的字符集合
int main()
{
char arr[] = "zpw@bitedu.tech hehe";
char* p = "@. ";
char tmp[30] = { 0 };
strcpy(tmp, arr);
char* ret = NULL;
for (ret = strtok(tmp, p);ret != NULL;ret = strtok(NULL, p))
{
printf("%s\n", ret);
}
//代码冗余:
//ret = strtok(tmp, p);
//printf("%s\n", ret);
//ret = strtok(NULL, p);
//printf("%s\n", ret);
//ret = strtok(NULL, p);
//printf("%s\n", ret);
return 0;
}
使用库函数的时候,如果失败,都会设置错误码
int errno;发生错误就会把代码放入errno
errno是全局的变量,所以要包含库函数<errno.h>
strerror:char* strerror(int errnum); - 翻译错误码
int main()
{
printf("%s\n", strerror(0));
printf("%s\n", strerror(1));
printf("%s\n", strerror(2));
printf("%s\n", strerror(3));
printf("%s\n", strerror(4));
printf("%s\n", strerror(5));
return 0;
}