【C语言】猜数字游戏
慕雪年华

函数是什么?

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

image

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

回溯

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

库函数

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

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

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

C语言常用的库函数

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

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

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

查询库函数定义

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

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

夹带私货时间

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

image

memset函数

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

image

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

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

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

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

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

image

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

image

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

注意每个函数下面绿色的这一行
以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

让我们继续解读

image

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

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

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 )方式

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

运行的结果如下图所示

image

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

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

strcpy函数

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

image
我们依旧用上述说的逐步解读法来查阅strcpy的定义

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

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

照样实践一下

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是我们要拷贝的内容

1
strcpy(arr2, arr1);

运行结果如下

image

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

字符结束标志

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

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

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

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小时就搞定了
点个赞再走吧,谢谢大家!