上图注意内容 代码解释如下
int main()
{
if (my_strlen("abc") - my_strlen("abcdef") > 0)
{
printf(">\n");
}
else
{
printf("<=\n");
}
return 0;
}
my_strlen
int my_strlen(const char* str)
{
int count = 0;//计数器
assert(str != NULL);
while (*str != '\0')
{
count++;
str++;
}
return count;
}
int main()
{
char arr[] = "abc";
//char arr[] = { 'a', 'b', 'c' };
int len = my_strlen(arr);
//
printf("%d\n", len);
return 0;
}
strcpy(依然要拷贝\0 他是结束标志)
int main()
{
//char arr1[20] = "####";
//arr = "hello";//err
//char* p = "hello";
//strcpy(arr1, "hello");//string copy
//char arr1[20] = "####";
//char arr2[] = { 'a', 'b', 'c' };
strcpy(arr1,arr2 );//会报错 因为arr2找不到\0
//char arr3[5] = "####";
char* p = "hello world";
strcpy(arr3, p); //会拷贝有结果 但是程序出问题了
char* str = "xxxxxxxxxxxxxxxxxxx";
char* p = "hello world";
strcpy(str, p);//不行 因为目标空间必须可修改 但是char*str是常量 不可改 。如上图倒数第二条
//printf("%s\n", arr);
return 0;
}
strcat(字符串追加)
int main()
{
char arr[20] = "abcd";
char arr2[20] = "abcd";
strcat(arr, arr2);// 追加的arr2里必须自己由\0 同时把\0也带过去
printf("%s\n", arr);
return 0;
}
模拟实现my_strcat
char* my_strcat(char* dest, const char*src)
{
char* ret = dest;
assert(dest && src); //发现有解引用就用下assert
//1. 找目标字符串中的\0
while (*dest)
{
dest++;
}
//2. 追加源字符串,包含\0
while(*dest++ = *src++)
{
;
}
return ret;//返回的目标空间的起始地址 。strcat语法要求
}
int main()
{
char arr1[20] = "hello ";//world
char arr2[] = "world";
//my_strcat(arr1, arr2);//字符串追加(连接)
printf("%s\n", my_strcat(arr1, arr2));
return 0;
}
strcmp(字符串比较函数)
第二大于第一返回-1
第一大于第二返回1
//strcmp - 字符串比较大小的
//int ret = strcmp("abbb", "abq");//<0 返回-1
int ret = strcmp("aaa", "aaa"); ==0 返回0
printf("%d\n", ret);
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++;
}
if (*s1 > *s2)
{
return 1;
}
else
{
return -1;
}
}
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;
}
int main()
{
char* p = "abcdef";
char* q = "abcdef";
int ret = my_strcmp(p, q);
if (ret > 0)
{
printf("p > q\n");
}
else if (ret < 0)
{
printf("p < q\n");
}
else
{
printf("p == q\n");
}
return 0;
}
strncpy
int main()
{
char arr1[20] = "abcdefghi";
char arr2[] = "qwer";
strncpy(arr1, arr2, 6);//确实拷贝6个 不够的放了2给\0
//strcpy(arr1, arr2);
strncpy(arr1, arr2, 2);
printf("%s\n", arr1);//qwcdef
return 0;
}
多了两个\0 有一个拷贝过去的 拷贝了5个 还剩一个是我们自己补充进去的
strncat
int main()
{
char arr1[20] = "hello ";
//hello wor\0
char arr2[] = "world";
strncat(arr1, arr2, 3);//追加三个后面的\0是代码自己主动放进去的
strncat(arr1, arr2, 10);//如果是10 较大 输出结果/hello world\0 输出到\0就不会再继续了
printf("%s\n", arr1);
return 0;
}
strncmp
int main()
{
char* p = "aqcdef";
char* q = "abcqwert";
//int ret = strcmp(p, q);
int ret = strncmp(p, q, 4);//让比较几个比较几个
printf("%d\n", ret);
return 0;
}
strstr
int main()
{
char arr1[] = "abbbcdef";
char arr2[] = "bbc";
//在arr1中查找是否包含arr2数组
char* ret = strstr(arr1, arr2);
if (ret == NULL)
{
printf("没找到\n");
}
else
{
printf("找到了:%s\n", ret);
}
return 0;
}
my_strstr 模拟实现
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; //因为const修饰了所以强制类型转换下
}
while (*cp)
{
s1 = cp;
s2 = str2;
//abcdef
// cdef
while (*s1 && *s2 && (*s1 == *s2))
{
s1++;
s2++;
}
if (*s2 == '\0')
{
return (char*)cp;
}
cp++;
}
return NULL;
}
int main()
{
char arr1[] = "abbbcdef";
char arr2[] = "bbc";
//在arr1中查找是否包含arr2数组
char* ret = my_strstr(arr1, arr2);
if (ret == NULL)
{
printf("没找到\n");
}
else
{
printf("找到了:%s\n", ret);
}
return 0;
}
strtok(切割字符串)
工作原理 他会把分隔符改成\0然后打印
int main()
{
char arr[] = "zpw@bitedu.tech";
char* p = "@. ";
char tmp[20] = { 0 };
strcpy(tmp, arr); //图片第三条注意后的解释
// zpw\0bitedu\0tech\0
char* ret = NULL;
ret = strtok(tmp, p);//调用一次只能传一个
printf("%s\n", ret);
strtok(NULL, p);//只要传空指针 调用一次后就记录了上一次\0的位置
printf("%s\n", ret);
strtok(NULL, p);
printf("%s\n", ret);
return 0;
}
第二种写法
int main()
{
char arr[] = "zpw@bitedu.tech hehe";
char* p = "@. ";
char tmp[30] = { 0 };
strcpy(tmp, arr);
//zpw\0bitedu\0tech\0
char* ret = NULL;
for (ret = strtok(tmp, p); ret != NULL; ret=strtok(NULL, p))
{
printf("%s\n", ret);
}
return 0;
}
strerror
错误码翻译或报错误信息
//使用库函数的时候
//调用库函数失败的是,都会设置错误码
//全局的错误码
//int errno;//5 错误码会被放在这里
#include <errno.h>
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));
FILE* pf = fopen("test.txt", "r");//打开文件 以读的形式打开。如果不存在就会失败。FILE*指针类型
if (pf == NULL)
{
printf("%s\n", strerror(errno));//失败原因
return 1;
}
//...
fclose(pf);
pf = NULL;
return 0;
}