距离上次更新本文已经过去了 730 天,文章部分内容可能已经过时,请注意甄别

函数是什么?

数学中我们常见到函数的概念,但是你了解 C 语言中的函数吗?
维基百科中对函数是如下定义的。

维基百科定义

可以说函数 function 是计算机变成语言中非常重要的一环。如果我们想学好 c 语言,就必须学会如何使用 库函数,以及如何创建自定义函数

回溯

在我的【猜数字游戏】博客中,已经有讲述过如何查询库函数的定义。在上一篇【传值调用和传址调用】中也有与自定义函数相关的内容。
本篇博客将更细致地向初学 c 的伙伴们分享如何使用库函数。

库函数

库函数,是 c 语言库中已经包含了的函数。这些函数的作用不一,但他们都有一个共同点 —— 所有人都用的上。

  • 当你写出一串代码,肯定会想知道它运行的结果,这时候要用到 printf 来打印
    大家第一个学习的 hello world 代码中就用到了 printf 库函数
  • 在编程过程中我们需要频繁地做字符串的拷贝 strcpy

既然所有人都用的上,那为什么不让这些函数变成编程语言中预设的功能,让后来者更方便的使用编程语言呢?这样效率倍增,可移植性和易用性也大大增强,何乐而不为。
库函数由此诞生

C 语言常用的库函数

  • IO 函数
  • 字符串操作函数
  • 字符操作函数
  • 内存操作函数
  • 时间 / 日期函数
  • 数学函数
  • 其他库函数

    【猜数字游戏】中使用到的 time 函数是时间函数的一种

接下来我用两个函数的具体案例,和大家分享如何查找库函数定义以及如何尝试使用库函数
分别是 strcpy 函数memset 函数

查询库函数定义

在这里给大家分享两个超棒的网站!

如果要查询库函数定义,cplusplus 是我们的不二之选。它虽然只有英文,但是这难不倒我们代码人,实在不行就网页翻译一下嘛!

夹带私货时间

如果你用的是 chrome 或者微软最新的 edge 浏览器,可以尝试安装侧边翻译这个插件
非常好用,强力推荐!

在这里插入图片描述

memset 函数

打开 cplusplus,输入我们需要查询的函数

在这里插入图片描述

看不懂?没关系。只要了解下面几个简单的单词,我们就能尝试去读库函数的定义了

  • function →函数
  • Parameters →参数
  • Return Value →返回值
  • Example →例子

在页面的左边我们可以看到函数的头文件

需要注意的是,是 c++ 语言里的头文件,而左边的 <string.h> 才是我们 c 语言要用的头文件

cplusplus 真正强大的地方,在于它可以让你直接在网页端编辑给出的代码例子

在这里插入图片描述

memset 其实是由两个单词组成的,memeory 内存 + set 设置

在这里插入图片描述

读函数定义的文档的时候,最好是逐字解读,不要整句翻译。

注意每个函数下面绿色的这一行
以 memset 为例,void * 表示它是指针变量,int 表示整型,size_t 表示大小

  1. Fill block of memory 填充内存块
  2. Sets the first num bytes 设置前 num 个字节
  3. Sets the first num bytes of the block of memory 设置内存块中的前 num 个字节
  4. pointed by ptr 由 ptr 指引的
  5. to the specified value 设置成特殊的 value

连起来就是:

把由 ptr 指引的内存块的前 num 个字节设置成特殊的 value

让我们继续解读

在这里插入图片描述

  • ptr 要被填充的内存块的 pointer 指示器
  • value 要被设定的特殊值,它是 int 整型
  • num 有多少字节的内存要被设定成 value
  • size_t 无符号整型

读到这里,关于 memset 的定义我们就能大概了解了
接下来就要进入实践了

c
1
2
3
4
5
6
7
8
9
10
#include<string.h>//memset头文件
#include <stdio.h>//printf头文件

int main()
{
char arr[] = "hello world";
memset(arr, '*', 5);
printf("%s\n", arr);
return 0;
}

在使用 memset 的时候,我们遵循定义中的 (void * ptr, int value, size_t num) 方式

c
1
memset(arr, '*', 5);
  • arr 是我们要更改的内容
  • ‘*’ 指我们把 arr 中的内容最终改成 ‘*‘
  • 5 表示我们想更改 5 个字符的内容
  • 用 printf 打印最终更改后的结果

运行的结果如下图所示

在这里插入图片描述

可以看到,hello world 中的前五个字符,也就是 hello 被改成了 *****
和 memset 的定义的描述完全一致!

怎样,是否有点小激动?(反正我当时学到这里的时候是有的)
让我们继续!

strcpy 函数

比起 memset 函数,strcpy 函数的使用频率更高
我们同样在 cplusplus 中查询 strcpy 函数的定义

在这里插入图片描述
我们依旧用上述说的逐步解读法来查阅 strcpy 的定义

  1. Copies the C string 拷贝内容
  2. pointed by source 由 source 指示的的内容
  3. into the array pointed by destination 到目标数组中

拷贝由 source 指示的内容到目标数组中

照样实践一下

c
1
2
3
4
5
6
7
8
9
10
11
#include <string.h>//strcpy函数头文件
#include <stdio.h>

int main()
{
char arr1[] = "bit";
char arr2[20] = "##########";
strcpy(arr2, arr1);
printf("%s\n", arr2);
return 0;
}

(arr2, arr1) 其中 arr2 是我们的目标,arr1 是我们要拷贝的内容

c
1
strcpy(arr2, arr1);

运行结果如下

在这里插入图片描述

当你看到这里的时候,肯定会有和我一样的疑惑:为什么拷贝到 2 中的内容只有 bit 三个字节,但是后续的#######没有打印出来呢?
这里就涉及到转义字符里面的内容了

字符结束标志

\0 是字符串的结束标志,默认跟在我们输入的字符后面

“bit” 字符实际为 ”bit\0“

打印的时候遇到”\0“会自动停止

c
1
2
3
char arr1[] = "bit";
char arr2[20] = "##########";
// bit\0遇到\0认为字符串结束,所以不打印后面的#

与 strcpy 长得很像的还有另外一个库函数 strlen
strcpy - string copy - 字符串拷贝
strlen - string length - 字符串长度有关

对于 strcpy 函数 和 memset 函数 的介绍到这里就结束了

结语

到这里,对于查询库函数以及使用库函数的方法应该已经很清晰了(自我感觉
希望对大家有所帮助
c 语言新人,有所纰漏在所难免,欢迎各路 dalao 无情指正

纯手打,4k 多字,今天效率比昨天高,2 小时就搞定了
点个赞再走吧,谢谢大家!