目录
补上章缺失的两道题
七.笔试题(7)
八.笔试题(8)
一.字符串函数 ( 1 )----strlen函数
二.字符串函数 ( 2 )----strcpy函数
2-1模拟实现strcpy
三.字符串函数 ( 3 )----strcmp函数
编辑
3-1模拟实现strcmp
四.字符串函数 ( 4 )----strcat函数
编辑
4-1模拟实现strcat
猫猫跟你说,每天进步一点点,在未来的某一天,一定会看到见到!!
人只有坚持把自己变好,就真的会越来越好!!
补上章缺失的两道题
七.笔试题(7)
#include <stdio.h>
//阿里的笔试题
int main()
{
char* a[] = { "work","at","alibaba" };
char** pa = a;
pa++;
printf("%s\n", *pa);
return 0;
}
如上图,a是一个字符指针数组,*a指向的是数组首元素地址,因为 **pa=a,所以将数组首元素地址传递给二级指针 pa ,接着pa++,就是第二个字符指针的地址
在printfh中对pa进行了一次解引用就是a的第二个元素,也就是at,用%s打印就是at
八.笔试题(8)
int main()
{
char* c[] = { "ENTER","NEW","POINT","FIRST" };
char** cp[] = { c + 3,c + 2,c + 1,c };
char*** cpp = cp;
printf("%s\n", **++cpp);
printf("%s\n", *-- * ++cpp + 3);
printf("%s\n", *cpp[-2] + 3);
printf("%s\n", cpp[-1][-1] + 1);
return 0;
}
如图所示,c对应的是字符指针数组,cp对应的是*c,,上图紫色线表示cp所对应的元素,*cpp=cp,*cpp对应的是首元素地址元素,c+3
printf("%s\n", **++cpp);
cpp++ 对应的是 c+2 , *cpp为cp,*cp对应的是c,所以** ++cpp按照%s打印为 POINT
printf("%s\n", *-- * ++cpp + 3);
注意,这个++cpp是在上一个printf的基础上进行的,*(cpp++)就是c+1,如左图* -- *++cpp所对应的就是ENTER,在这个基础上 +3 对应的就是ER
printf("%s\n", *cpp[-2] + 3); cpp[-2]也就等于cpp-2 ,(注意:cpp[-2]==cpp-2是固定的,一个是指针形式,一个是数组形式) *(cpp-2)对应的是c+3,再进行解应用操作对应的就是FIRST, FIRST + 3对应的就是ST
printf("%s\n", cpp[-1][-1] + 1);也就等于*(*(cpp-1)-1)+1,*(cpp-1)对应的是c+2,*(*(c+2)-1)就是NEW,在这个基础上+1就是E
指针笔试题还是很有难度的,大家还是要多看几遍,尽量理解透彻!!!!!!!!
下面进入本章正题
一.字符串函数 ( 1 )----strlen函数
由于本字符串函数以前提过,博主在这里就不多做解释了
二.字符串函数 ( 2 )----strcpy函数
通俗点说:strcpy函数就是将逗号后面(源数组)的字符串复制粘贴到逗号前面(目标数组)
注意:1.前面的数组 (目标数组)可能没有'\0',所以逗号后面的数组(源数组)必须有'\0'
2.前面的数组(目标数组)的空间要足够大,保证能放下后面数组(源数组)的字符串
3.前面的数组(目标数组)要可变
int main()
{
char arr1[20] = {0};
char arr2[] = "HELLO";
strcpy(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
打印出来是 HELLO
就是将arr2中的HELLO拷贝到arr1中
2-1模拟实现strcpy
#include <assert.h>
//
//strcpy函数返回的是目标空间的起始地址
//
char* my_strcpy(char*dest, const char* src)
{
char* ret = dest;
assert(dest && src);
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char arr1[20] = { 0 };
char arr2[] = "abc";
/*
my_strcpy(arr1, arr2);
printf("%s\n", arr1);
*/
//两种写法都可以
printf("%s\n", my_strcpy(arr1, arr2));
return 0;
}
三.字符串函数 ( 3 )----strcmp函数
stcmp函数用来比较两个字符串
上面翻译的很详细,就不做多余的解释了
int main()
{
char arr1[] = "abq";
char arr2[] = "abc";
if (strcmp(arr1, arr2) > 0)
{
printf(">\n");
}
else
{
printf("<=\n");
}
return 0;
}
输出 >
3-1模拟实现strcmp
int my_strcmp(const char* str1, const char* str2)
{
assert(str1 && str2);
while (*str1 == *str2)
{
if (*str1 == '\0')
return 0;
str1++;
str2++;
}
return *str1 - *str2;
}
int main()
{
char arr1[] = "abq";
char arr2[] = "abc";
if (my_strcmp(arr1, arr2) > 0)
{
printf(">\n");
}
else
{
printf("<=\n");
}
return 0;
}
输出 >
四.字符串函数 ( 4 )----strcat函数
strcat函数用来追加字符串,将逗号后面的数组追加到逗号前面的末尾,从'\0'的位置开始追加
注意:1.逗号后面的数组(源数组)必须有'\0'
2.前面的数组(目标数组)的空间要足够大,保证能放下后面数组(源数组)的字符串
3.前面的数组(目标数组)要可变
int main()
{
char arr1[20] = "abc";
strcat(arr1, arr1);//strncat
printf("%s\n", arr1);
return 0;
}
输出 abcabc
4-1模拟实现strcat
//strcat函数,返回的是目标空间的起始地址
char* my_strcat(char* dest, const char* src)
{
char* ret = dest;
assert(dest && src);
//1. 找到目标空间的末尾
while (*dest != '\0')
{
dest++;
}
//2. 数据追加
while (*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char arr1[20] = "abc";
char arr2[] = "def";
my_strcat(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
输出的是 abcdef
记得点个关注,要不然容易找不到!!!!
下一章继续更新字符串函数,敬请期待
如果有解释的不对或者不清晰,麻烦大佬们海涵,如果可以烦请从评论区指出,我一定会加以修改,万分感谢
最后麻烦大佬们动一下你们的小手一键三连,万分感谢