第四章、基本输入输出函数

什么是函数

函数(Function)是实现了一个功能的代码块。函数有函数的名字,函数名代表一段代码块的起点。也代表一个功能。

函数都有自己的名字,如:printfmain 等。不同的名字代表不同的功能。

函数对应英文是 Function,其实函数翻译成中文为 功能 会更好理解(个人见解)。

C 语言中已经实现了一些函数供编码人员调用,这些函数我们称之为标准库函数。

函数的调用

函数只有调用了,函数内部的代码才能够执行,才能够发挥作用。

函数调用的语法

函数名(表达式1, 表达式2, 表达式3, ...)

语法说明:

  1. 函数名 代表函数的功能。
  2. () 代表调用此函数(让函数执行)。
  3. () 括号内的表达式计算的结果是给函数提供数据(通常叫做实际调用参数),即函数的输入。多个数据给函数时需要用英文的逗号分隔符(,)分隔。一个函数需要多少个参数是由这个函数的声明者(编写函数的人)决定的。
  4. 函数调用是一个表达式,它可以返回一个值。

示例:

#include <stdio.h>

int main(int argc, char *argv[]) {
    printf("Hello World!\n");
    printf("age:%d\n", 35);
    return 0;
}

上述程序中,第一个 printf 函数只有一个参数为 "Hello World!\n",第二个 printf 函数有两个参数为 "age:%d\n"35,中间用英文的逗号(,)分隔。

1. printf函数

printf 函数是用来在屏幕终端上打印一个标准输出,来让用户看到程序执行中运行的一些结果。

printf 的头文件

在使用库函数前,我们必须在当前的 .c 文件中使用 #include <xxx.h> 来包含库函数声明的头文件。C 语言的函数需要先声明再使用,而 printf 函数的声明在 头文件 stdio.h中。因此需要在 文件头部加上 #include <stdio.h>

stdio 含义为 标准输入输出(Standard Input/Output)。 .h 通常是头文件的后缀。

包含头文件的语法

#include <头文件名>

如,包含 stdio.h 这个文件的写法如下:

#include <stdio.h>

只要一次包含就可以多次使用此库中的所有函数了。

printf 的调用格式:

printf(格式字符串, 表达式1, 表达式2, ...);

例如:

#include <stdio.h>

int main(int argc, char *argv[]) {
    printf("hello!\n");
    printf("name:%s, age:%d\n", "张三", 18);
    return 0;
}

执行结果如下:

hello!
name:张三, age:18

上述程序中第二个 printf 的第一个参数(格式字符串)中 %s%d格式说明符(也叫占位符),此处的数据需要使用第二个参数("张三")和第三个参数(18)填充。而第一个 printf 中 的第一个参数的字符串中没有%开头的格式说明符,则不需要额外的参数。

printf 格式说明符格式

%[flags][width][.precision][length]specifier

其中 中括号([]) 括起来的部分表示可选项。

说明:

格式化字符串的 格式字符

格式字符
对应数据类型
%d
十进制整数(int)
%i
十进制整数(同 %d)
%u
无符号十进制整数
%o
八进制整数
%x
十六进制整数(字母小写)
%X
十六进制整数(字母大写)
%f
浮点数(默认保留小数点后六位)
%e
指数显示浮点数(字母小写)
%E
指数显示浮点数(字母大写)
%g
自动转换小数和指数格式(字母小写)
%G
自动转换小数和指数格式(字母大写)
%c
单个字符
%s
字符串
%p
指针(十六进制表示)
%%
表示一个百分号%

长度修饰符

修饰符
说明
%ld
用于 long int或 unsigned long int
%lld
用于 long long int或 unsigned long long int
%Lf
用于 long double

示例

#include <stdio.h>

int main(int argc, char *argv[]) {
    float pi = 314.15926535;
    int x = 8815431;
    long long int lli= 1000;

    printf("---%d---\n", x);
    printf("---%u---\n", x);
    printf("---%i---\n", x);
    printf("---%o---\n", x);
    printf("---%x---\n", x);
    printf("---%X---\n", x);
    printf("---%f---\n", pi);
    printf("---%e---\n", pi);
    printf("---%g---\n", pi);
    printf("---%G---\n", pi);
    printf("---%lld---\n", lli);

    printf("=======================\n");

    printf("---%10d---\n", x);
    printf("---%-10d---\n", x);
    printf("---%+10d---\n", x);
    printf("---%010d---\n", x);
    printf("---%hd---\n", x); // 转为short类型,丢失高位数据
    printf("---%#x---\n", x);
    printf("---%10.2f---\n", pi);
    printf("---%.3f---\n", pi);
    return 0;
}

执行结果:

---8815431---
---8815431---
---8815431---
---41501507---
---868347---
---868347---
---314.159271---
---3.141593e+02---
---314.159---
---314.159---
---1000---
=======================
---   8815431---
---8815431   ---
---  +8815431---
---0008815431---
----31929---
---0x868347---
---    314.16---
---314.159---

练习:

  1. 使用指数形式打印圆周率。
  2. 使用小数形式打印圆周率,小数点后保留2位有效数字。
  3. 使用小数形式打印圆周率,小数点后保留2位有效数字,共占据7个字符,数前空格补充0