————strcpy函数
char *strcpy(char *dest, const char *src) //函数的声明,这里所传递的参数是数组。
因为我们是要把src的内容复制到dest,所以在此过程中src的内容是不需要也不应该改变的,加上const修饰。
该函数的返回值是指向dest的指针(可以拿它来做些小事情)
实验10.2.1 验证strcpy函数
运行结果
使用时要注意,如果目标数组不够大,而源字符串的长度又太长,可能会造成缓冲溢出的情况(程序会崩溃),因此在使用的时候要特别注意,可以选择在定义数组时,将目标数组尽可能的大一些。
我们也可以选择自己来写一写strcpy函数!
普通版本:
这里有两个值得注意的地方。
首先是while的判断,src[idx]!=' ' ,来控制循环的进行。
其次是在复制出来的idx末尾加上' ',来使得它成为一个字符串。
指针版本:
与普通版本在原理上并没有什么不同。
————strcat函数
C 库函数 char *strcat(char *dest, const char *src) 把 src 所指向的字符串追加到 dest 所指向的字符串的结尾。具体的机制与strcpy相类似,同样需要注意目标数组的大小。
char *strcat(char *dest, const char *src) //对函数的声明
函数返回值是指向dest的指针。
实验10.2.2 验证strcat函数
运行的结果应当是
————安全版本的写入操作
在前面介绍这些函数时,我们都会强调一个点,即注意不要把超过目标数组的大小的字符串拷贝进去,因为这一定会导致程序崩溃。那么究竟有没有一种方法来解决这种忧虑,达到未雨绸缪呢?答案是肯定的,C给了我们一种安全版本的写入。
注意红色下划线的n,它代表一个正整数,即规定了最多能够写入目标数组的字符数量,如果超出规定,则全部“剪切”掉。
————strchr 和 strrchr函数
C 库函数 char *strchr(const char *str, int c) 在参数 str 所指向的字符串中搜索第一次出现字符 c(一个无符号字符)的位置。(strchr和strchrr的功能相类似,只不过后者是从右方开始移动)
该函数返回值
该函数返回在字符串 str 中第一次出现字符 c 的位置,如果未找到该字符则返回 NULL。
事实上,通过一个实验,我们可以发现一个问题,该函数的返回值是一种我们目前所不知道的东西。
实验10.2.3
#include
#include
int main()
{
const char str[] = "Hello";
const char ch = 'e';
char* p = strchr(str, ch);
printf("目前指针所指向的是%p", p);
printf("目前的字符串是%s", p);
return 0;
}
运行的结果是,编译通过,并显示出
我们可以注意到实验中两次的输出,我们都使用的是p,而p是什么呢?我们说它是一个指针变量,因为我们就是这么去定义它的。前面的学习中我们知道指针变量里存放的是它所指向的那个变量的地址,它是一个整数(可以这么说,但实际上不对)。
printf("目前指针所指向的是%p", p);
printf("目前的字符串是%s", p);
可是我们发现,在输出一个字符串时,我们没有用 *p来取出p所指向的那个变量的值,我们直接就用的是p。
下面对此进行深入探究
实验10.2.4
我们接着在原来的代码中加了两行,直接用strchr(str,ch) 来作为值输出,可以看到结果完全一样。
为什么会出现和我们前面学习指针时相矛盾的结果?现在不妨保留这个疑问,我们下一步的学习将揭开这个谜底。
事实上,上面所进行的探究是毫无意义的,这里涉及到一个非常容易弄混淆的一个概念,也涉及到我们数据在内存里存放的形式和特性(由于我们无法用肉眼观察到数据是怎么在内存里储存的,我们只能通过实验来探索。)
首先看我们对 char *p=strchr(str,ch); 的使用
这其中混淆了一个概念,即一片连续的空间和一个单独的点空间,它所代表的指针含义是不同的。事实上,p这个我们定义出来的东西,就跟数组名一样,它即代表一个地址,又代表首个单元的值。
strchr返回的是一片连续的内存中的首地址,此刻p就代表数组中数组名,它同时具备了两种性质(这里完全是人为规定的,为了方便使用,但我为此可是耗费了不少时间)。
实验10.2.5
该实验的重点是 malloc函数的实际运用。
实验10.2.6
这里进行的操作是,将“指针”移到'l'哪里,并且插入一个' ',字符串遇到 则结束,所以后面的llo无效化,s里面只剩下he,这样就实现了得到strchr后前面的内容。
————strstr函数
该函数不常用,可以自行设计来探索!



